qsort i struktura. tablica wskaźników

0

hej. Chciałabym przesortować studentów według lat. mógłby mi ktoś wytłumaczyć dlaczego bad_stb_cmp() nie chce działać? co qsort przekazuje do tej funkcji porównującej jeżeli nie students[i] (inaczej *(students+i)? nie chce już nawet mówić, że straciłam nad tym z 10x czasu niż jakbym ręcznie napisała funkcje do sortowania a wskaźniki w takich przypadkach...(>_<) moi znajomi mówią, że mnie poo***ało, że wybrałam ten kierunek i to jest prawda w takich przypadkach.

typedef struct {
	unsigned age;
	char *name;
} student_t;

typedef struct {
	student_t **students;
	unsigned nalloc_elems;
	unsigned nof_elems;
} stbase_t;

static int stb_cmp(const void *a, const void *b) {
	student_t *aa = *(student_t**)a;
	student_t *bb = *(student_t**)b;

	return (aa->age - bb->age);
}

static int bad_stb_cmp(const void *a, const void *b) {
	student_t *aa = (student_t*)a;
	student_t *bb = (student_t*)b;

	return (aa->age - bb->age);
}

int main(void) {
	qsort(stb->students,stb->nof_elems,sizeof(student_t*),stb_cmp); /* sortuje */
	qsort(stb->students,stb->nof_elems,sizeof(student_t*),bad_stb_cmp); /* nie chce sortowac */
	return 0;
}
0

Dlaczego używasz podwójnych wskaźników? Tylko sobie komplikujesz kod.

A propos różnicy w tych funkjach.

*(student_t**)a; //a wskazuje na wskaźnik. Po dereferncji otrzymujemy wskaźnik wskazujący na obiekt
(student_t*)a; //dostajesz wskaźnik na obiekt, z tym, że ten wskaźnik dalej wskazuje na wskaźnik
0

No jak to dlaczego?

int main(void) {
	int a;
	int* x = &a;
	int** pointer = &x;
	printf("%p\n", (int*)pointer);
	printf("%p\n", *(pointer));
	return 0;
}

Output:

0xbfcd73ec
0xbfcd73e8

http://ideone.com/6ojwZz

Widzisz roznice?

0
Sopelek napisał(a):

Dlaczego używasz podwójnych wskaźników?

żeby w stdbase_t mieć tablicę tych student_t. Inaczej się chyba nie da

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