2013-10-16 17 views
8

Robię niezawodnego protokołu przesyłania danych i mieć prototyp funkcjiKompilowanie C - "niezdefiniowane odniesienie do"?

void tolayer5(int, char data[]); 

Przy pomocy structs

struct msg { 
    char data[20]; 
}; 

struct pkt { 
    int seqnum; 
    int acknum; 
    int checksum; 
    char payload[20]; 
}; 

I kiedy wywołać funkcję w następującym formacie:

tolayer5(A, packet.payload); 

Gdzie A to int i packet.payload jest struct pkt, otrzymuję błąd lub "niezdefiniowane odniesienie do 'tolayer5(int, char*)'. Czy możesz mi pomóc zobaczyć, czego tu brakuje?

void tolayer5(int AorB, char data[]) 
{ 
    int i; 
    if (TRACE>2) 
    { 
    printf("TOLAYER5: data received:"); 
    for (i=0; i<20; i++) 
     printf("%c",data[i]); 
    printf("\n"); 
    } 
} 

Dziękuję wszystkim za pomoc w oryginalnym wydaniu! :) Próbując to naprawić, natknąłem się na nieskończoną pętlę, która, jak sądzę, ma coś wspólnego ze niewłaściwym adresowaniem znaków w tablicy (minęło trochę czasu odkąd zrobiłem to w ten sposób: C. Czy możesz mi pomóc dowiedzieć się, gdzie tworzę nieskończoną pętlę

I zostały zaktualizowane powyższy kod do tego, co ja teraz pracuje z zachowaniem główne zmiany zostały do ​​mojej funkcji:.

void tolayer5(int AorB, char data[]) 

i to wewnątrz linii funkcja: printf("%c",msgReceived.data[i]); od teraz jest po prostu:

printf("%c",data[i]); 
+1

To jest błąd połączenia, czy na pewno łączysz również implementację dla 'void tolayer5 (int, char data []);'? – orlp

+0

Jest plikiem c, który implementuje tolayer5 w projekcie. – drescherjm

+1

Ponowna edycja: prototyp jest niekompatybilny z jego implementacją. char [] vs struct msg. –

Odpowiedz

11

wydaje trzeba połączyć z pliku OBJ, który implementuje tolayer5()

Update: Twój deklaracja funkcji nie pasuje do realizacji:

 void tolayer5(int AorB, struct msg msgReceived) 
     void tolayer5(int, char data[]) 

więc kompilator będzie traktować je jako dwa różne funkcje (używasz C++). i nie może znaleźć implementacji dla tej, którą wywołałeś w main().

+0

Po prostu to, moja funkcja tolayer5() nie znajduje się w pliku obiektowym; jest w tym samym pliku, tylko w dolnej części. –

+0

Ahhh, widzę! Nie mogłem zmienić mojego wcześniejszego sposobu wywoływania funkcji. Dziękuję Ci! :) –

1

Upewnij się, że zadeklarowano funkcję tolayer5 jako prototyp lub zdefiniuj pełną definicję funkcji, wcześniej w pliku, w którym go używasz.

+0

Mój obecny prototyp funkcji jest tym, który wymieniłem (void tolayer5 (int, char data []);) Czy masz na myśli coś takiego jak "void tolayer5 (int bla 1, char bla 2 [])?" Kiedy próbuję tego, daje mi ten sam błąd. –

1

Jak stwierdzono przez kilka innych, jest to błąd połączenia. Sekcja kodu, w której wywoływana jest ta funkcja, nie wie, jaka jest ta funkcja. Musi być zadeklarowany w pliku nagłówkowym jako zdefiniowany we własnym pliku źródłowym lub zdefiniowany lub zadeklarowany w tym samym pliku źródłowym, powyżej miejsca, w którym jest wywoływany.

Edytuj: W starszych wersjach C, C89/C90 deklaracje funkcji nie były faktycznie wymagane. Możesz więc dodać definicję w dowolnym miejscu pliku, w którym używasz tej funkcji, nawet po wywołaniu, a kompilator wywnioskuje deklarację. Na przykład:

int main() 
{ 
    int a = func(); 
} 

int func() 
{ 
    return 1; 
} 

Jednak obecnie nie jest to dobra praktyka i większość języków, na przykład C++, nie pozwoli na to. Jednym ze sposobów na uniknięcie zdefiniowania funkcji w tym samym pliku źródłowym, w którym go używasz, jest zadeklarowanie go na początku pliku. Tak więc, poprzedni przykład wyglądałby tak.

int func(); 

int main() 
{ 
    int a = func(); 
} 

int func() 
{ 
    return 1; 
} 
+0

Jaki byłby nagłówek właściwej funkcji do umieszczenia na górze, biorąc pod uwagę informacje, które podałem? Naprawdę nie jestem pewien, czego mi brakuje, aby go połączyć. :( –

+0

Poprawiłem moją odpowiedź, aby dodać trochę wyjaśnień. – dsell002

Powiązane problemy