2013-07-26 13 views
5

Próbuję zainicjować tablicę struktur. na elemencie mieć wskaźników funkcji w nich i są określone jako takie:zainicjować tablicę struktur ze wskaźnikami funkcji w nich C

typedef struct{ 
     char str[512]; 
     char *fptr; 
} infosection; 

następnie staram się tablicę:

infosection section[] = { 
     ("Software", *SoftwarePtr), 
     ("Hardware", *HardwarePtr), 
} 

ja zdefiniował wskaźników funkcji za pomocą prostego samouczka. Funkcja Software zwraca int

int (*SoftwarePtr)()=NULL; 
SoftwarePtr = &Software; 

Moje pytanie jest o ostrzeżeniach dostaję po kompilacji.

Inicjalizacja powoduje całkowitą od wskaźnika bez oddanych

Ostrzeżenie referencje wierszy w tablicy sekcji.

Więc mam dwie wątpliwości:

  1. jestem nadużywania */&/ani dla wskaźnika Próbowałem kombinacje każdy i wciąż wydaje się mieć same warning.I sobie sprawę z znaczenie każdego, po prostu nie wiem, w jaki sposób mają zastosowanie w tym konkretnym przypadku.
  2. Mogę zadeklarować instancję infosection struct w szyku, jak to zrobić tutaj? Widziałem wiele przykładów, gdzie ludzie deklarują array of struct w for loop, Jednak mój produkt końcowy wymaga długiej listy kodowanym mają być zawarte w które array.I chciałbym, aby mój kod portable tak, że ludzie mogą add structs (ciągi, które odpowiadają funkcji do wskazania) w łatwy sposób podobny do listy, jak widać. Jest to jedyny sposób, aby zadeklarować instancję tablicy

    infosection section[]; 
        section[0].str="software"; 
        section[0].fptr=SoftwarePtr; 
    

Właśnie w celu wyjaśnienia, mam zrobić trochę badań na structs, array of structs i function pointers. Wydaje się, że kombinacja 3 powoduje kłopoty.

+0

Myślałem, że wskaźniki funkcji były nieważne *(). – Jiminion

+0

@Jim Przeczytałem tutaj: http://www.newty.de/fpt/fpt.html#defi ten wskaźnik funkcji musi być zadeklarowany z typem zwracanym przez funkcję, którą wskazują ... –

+0

'char * fptr; 'To nie jest wskaźnik funkcji, a konwersje pomiędzy' char * 'a wskaźnikiem funkcji nie są dobrze zdefiniowane – Lundin

Odpowiedz

7

Jeden

Jeden błąd I znaleźć w deklaracji struktury od wskaźnika funkcji jest niepoprawna:

typedef struct{ 
     char str[512]; 
     int (*fptr)(); // not char* fptr 
} infosection; 

Dwa

deklaracja:

infosection section[] = { 
     ("Software", *SoftwarePtr), 
     ("Hardware", *HardwarePtr), 
} 

Powinno być:

infosection section[] = { 
     {"Software", SoftwarePtr}, 
     {"Hardware", HardwarePtr} 
} 

Usuń *. i zamień wewnętrzny () z .

trzy:

infosection section[]; 
section[0].str="software"; // compiler error 
section[0].fptr=SoftwarePtr; 

jest nie tak nie można przypisać ciąg w ten sposób. musisz użyć strcpy() w następujący sposób;

strcpy(section[0].str, "software"); 
+0

Nie ma nic złego w końcowym przecinku: niektóre style kodowania nawet faworyzują go, ponieważ sprawia, że ​​każdy wiersz jest spójny. Listy inicjalizacji list zawsze pozwalały mieć końcowe przecinki w ostatnim wierszu. – Lundin

+0

@Lundin Tak, masz rację. dzięki. –

2

Człon struktury jest obecnie char *, zmień na prawidłowy typ wskaźnika dla podpisu funkcji.

typedef struct{ 
    char str[512]; 
    int (*fptr)(); 
} infosection; 

* Usuń zaznaczenie wskaźnika, przeczytaj * foo jako "co foo wskazuje". Chcesz ustawić element struktury do faktycznego wskaźnika, użyj także bransoletek zamiast paranthezy.

infosection section[] = { 
    {"Software", SoftwarePtr}, 
    {"Hardware", HardwarePtr} 
} 
1

Minęło trochę czasu odkąd grałem ze wskaźnikami, ale może konstruktor mógłby pomóc?

struct infosection{ 
     char str[512]; 
     char *fptr; 
     infosection(char* strN, char* fptrN): str(strN), fptr(fptrN) {} 
}; 

infosection[] isxn = { new infosection(&str1,fptr1), 
       new infosection(&str2,fptr2)}, 
       ... }; 

moje przeprosiny ... gdzie C i C++ przystanki zaczyna zaciera się w mojej głowie, widziałem obejście dla C, który wygląda tak (ale nie dokładnie, jestem pewien, że niektórzy wskaźnika rzeczy jest mieszana ale to był pomysł)

struct infosection{ 
    char str[512]; 
    char *fptr; 
}; 

infosection* myIS (char *strN, char *fptrN) { 
    infosection i = new infosection(); 
    i.str = &strN; 
    i.fptr = fptrN; 
    return *i; 
} 

//infosection* newInfoSection = myIS(myStrPtr,myFptr); 
+0

Constuctors są częścią C++ i nie będą działać w tym senario =) – krs

Powiązane problemy