Ĺadny brzuch
Albo jestem bardzo zmęczony i czegoś nie wychwyciłem, albo przekazywanie tablicy struktur wygląda inaczej niż normalnych tablic...
Mam taki fragment kodu:
struct buddy { char name[MAX_NAME_LENGTH]; int number; }; struct buddy contact_list[MAX_CONTACTS]; int check_params(int argc, char *argv[]); int get_contacts(char *argv[],struct buddy *contact_list[]);
oraz wywołanie:
get_contacts(argv, contact_list);
W rezultacie dostaję warninga:
warning: passing argument 2 of ‘get_contacts’ from incompatible pointer type
Jak można to poprawić? Wiem, że to tylko ostrzeżenie, ale wolę być ich unikać :)
Użytkownik KORraN edytował ten post 29 luty 2008, 17:53
wg mnie taki kod nie powinien sie skompilować, przynajmniej nie kompiluje sie na VC++ 6.0. Deklaracja funkcji get_contacts() wskazuje, że funkcja oczekuje drugiego argumentu (struct buddy *contact_list[], lub struct buddy **contact_list) w postaci wskaźnika do wskaźnika, czyli musiałbyś stworzyć tablicę dwuwymiarową struktur np. struct buddy contact_list[MAX_CONTACTS][MAX_CONTACTS]; a ty przekazujesz nazwę tablicy, czyli inaczej adres pierwszego jej elementu, więc drugi argument funkcji powinien wyglądać tak: struct buddy *contact_list;.
U mnie na gcc się kompiluje :). Co nie zmienia faktu, że coś jest nie tak. Na szybko próbowałem poprawić tak jak piszesz, ale też to samo. Zastanawiam mnie to, że pierwszy argument jest też tablicą i ten sam sposób jej przekazywania działa, a przy strukturach coś nawala.
Nic nie nawala tylko masz błąd jeszcze gdzieś indziej :) Przyjrzyj się temu programowi, wszystko ładnie działa i przekazując tablicę do funkcji mogę z nią robić praktycznie wszystko:#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_CONTACTS 5 #define MAX_NAME_LENGTH 10 typedef struct _buddy { char name[MAX_NAME_LENGTH]; int number; } buddy; buddy contact_list[MAX_CONTACTS]; void print_contacts(buddy* t) { int i; for(i=0; i<MAX_CONTACTS; ++i) { printf("%s\t%d\n",(*(t+i)).name, &t[i]); } } void fill_contacts(buddy* t) { int i; strcpy(t[0].name,"buddy0"); strcpy((*(t+1)).name,"buddy1"); strcpy((t+2)->name,"buddy2"); strcpy(t[3].name,"buddy3"); strcpy(t[4].name,"buddy4"); srand((unsigned)time(NULL)); for(i=0;i<MAX_CONTACTS;++i) { t[i].number = rand(); } } int main(int argc, char** argv) { fill_contacts(contact_list); print_contacts(contact_list); system("pause"); return 0; }
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Mam taki fragment kodu:
struct buddy { char name[MAX_NAME_LENGTH]; int number; }; struct buddy contact_list[MAX_CONTACTS]; int check_params(int argc, char *argv[]); int get_contacts(char *argv[],struct buddy *contact_list[]);
oraz wywołanie:
get_contacts(argv, contact_list);
W rezultacie dostaję warninga:
warning: passing argument 2 of ‘get_contacts’ from incompatible pointer type
Jak można to poprawić? Wiem, że to tylko ostrzeżenie, ale wolę być ich unikać :)
Użytkownik KORraN edytował ten post 29 luty 2008, 17:53
wg mnie taki kod nie powinien sie skompilować, przynajmniej nie kompiluje sie na VC++ 6.0. Deklaracja funkcji get_contacts() wskazuje, że funkcja oczekuje drugiego argumentu (struct buddy *contact_list[], lub struct buddy **contact_list) w postaci wskaźnika do wskaźnika, czyli musiałbyś stworzyć tablicę dwuwymiarową struktur np. struct buddy contact_list[MAX_CONTACTS][MAX_CONTACTS]; a ty przekazujesz nazwę tablicy, czyli inaczej adres pierwszego jej elementu, więc drugi argument funkcji powinien wyglądać tak: struct buddy *contact_list;.
U mnie na gcc się kompiluje :). Co nie zmienia faktu, że coś jest nie tak. Na szybko próbowałem poprawić tak jak piszesz, ale też to samo. Zastanawiam mnie to, że pierwszy argument jest też tablicą i ten sam sposób jej przekazywania działa, a przy strukturach coś nawala.
Nic nie nawala tylko masz błąd jeszcze gdzieś indziej :) Przyjrzyj się temu programowi, wszystko ładnie działa i przekazując tablicę do funkcji mogę z nią robić praktycznie wszystko:#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_CONTACTS 5 #define MAX_NAME_LENGTH 10 typedef struct _buddy { char name[MAX_NAME_LENGTH]; int number; } buddy; buddy contact_list[MAX_CONTACTS]; void print_contacts(buddy* t) { int i; for(i=0; i<MAX_CONTACTS; ++i) { printf("%s\t%d\n",(*(t+i)).name, &t[i]); } } void fill_contacts(buddy* t) { int i; strcpy(t[0].name,"buddy0"); strcpy((*(t+1)).name,"buddy1"); strcpy((t+2)->name,"buddy2"); strcpy(t[3].name,"buddy3"); strcpy(t[4].name,"buddy4"); srand((unsigned)time(NULL)); for(i=0;i<MAX_CONTACTS;++i) { t[i].number = rand(); } } int main(int argc, char** argv) { fill_contacts(contact_list); print_contacts(contact_list); system("pause"); return 0; }