Wątek przeniesiony 2017-06-25 14:37 z C/C++ przez kq.

Przekazywanie dynamicznej tablicy wskaźników na struktury do funkcji i jej obsługa

0
typedef struct pracownik {
	char imie[20];
	char nazwisko[50];
	int urodziny;
	double wynagrodzenie1;
	double wynagrodzenie2;
	double wynagrodzenie3;
	double wynagrodzenie4;
	double srednie;	
}pracownik;

main()
{
printf("Ilu pracownikow chcesz wprowadzic:  ");
					while(scanf("%d", &x)!=1)
					{
						printf("Blad! sprobuj jeszcze raz!");
					}
					pracownik *dane=(pracownik*)malloc(sizeof(pracownik)*x);	/*przypisanie dane adresu pierwszego elementowi tablicy x wartosci pracownik */
												
					setPracownik (&dane[0] , x);
}


setPracownik (pracownik *p, int n) //funkcja wpisująca dane do struktury
{
	int i, x=n; 
	puts("Wprowadzanie danych: \n");
	for(i=0; i<x; i++)
	{
		printf("Podaj imie: ");
		scanf("%s",(p+i)->imie); 
		printf("Podaj nazwisko: ");
		scanf("%s",(p+i)->nazwisko);
		printf("Podaj rok urodzenie: ");
		scanf("%d",&p[i].urodziny);
		printf("Podaj wynakrodzenie za I kwartal: ");
		scanf("%lf", p[i].wynagrodzenie1);
		printf("Podaj wynagrodzenie za II kwartal: ");
		scanf("%lf", p[i].wynagrodzenie2);
		printf("Podaj wynagrodzenie za III kwartal: ");
		scanf("%lf", p[i].wynagrodzenie3);
		printf("Podaj wynagrodzenie na IV kwartal: ");
		printf("%lf",p[i].wynagrodzenie4);
		printf("Podaj srednie wynagrodzenie: ");
		scanf("%lf", p[i].srednie);
		system ("cls");
	}
}
  1. Zastanawiam się dlaczego skoro alokując pamieć w tablicy dane ,mam adres jej pierwszego elementu, a mimo to nie mogę przy wartości int i float operować wskaźnikami. Program się wysypuje.
  2. Dlaczego mimo ,iż p[i] wskazuje na adres muszę przed tą tablicą dodać "&" ?
  3. Jak ma za alokować pamieć by móc swobodnie poruszać się wskaźnikami w funkcji wpisz?
  4. Pytanie dodatkowe:
    Czy zapis (*wsk).urodziny
    i zapis wsk->urodziny jest tym samym, czyli przy zapisie wsk->urodziny odwołuję się do komórki z danymi a nie adresu zmiennej?
0
  1. nie rozumiem pytania. Chodzi Ci o to, że nie możesz tablicy struktur typu pracownik traktować jak tablicy intów? Mają różne rozmiary.
  2. p[i] jest równoznaczne z *(p+i), czyli to lvalue o typie elementu tablicy, a nie wskaźnik na element.
  3. przez wpisz masz na myśli setPracownik? Jeśli tak to przecież teraz dostajesz wskaźnik.
  4. tak, zapraszam do dowolnej książki lub kursu C.
0

Skoro p[i].urodziny oraz *(p+i).urodziny plus (p+i)->urodziny jest tym samym, to jak przy elementach struktury o type int lub float przesłać tylko adres, tak by nie trzeba było dodawać "&"?

0

*(p+i).urodziny jest czymś innym i się nie skompiluje, ze względu na priorytety operatorów. (*(p+i)).urodziny to to samo co p[i].urodziny i (p+i)->urodziny.

W prosty sposób się nie da. W czym Ci & przeszkadza?

0

Ok, teraz przynajmniej rozumiem dlaczego moje kombinacje kończyły się fiaskiem :) .
Dziękuje za informacje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1