web-dev-qa-db-fra.com

Compilation C - "référence non définie à"?

Je fais un protocole de transfert de données fiable et j'ai le prototype de fonction

void tolayer5(int, char data[]);

Avec le structs

struct msg {
  char data[20];
};

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

Et quand j'appelle la fonction dans ce format:

tolayer5(A, packet.payload);

A est un int et packet.payload Est un struct pkt, J'obtiens l'erreur "référence non définie à 'tolayer5(int, char*)'. Pouvez-vous aider me voir ce qui me manque ici?

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");
  }
}

Merci à tous d'avoir aidé à résoudre le problème d'origine! :) En essayant de résoudre ce problème, cependant, je suis tombé sur une boucle infinie qui, selon moi, a quelque chose à voir avec le fait que j'adresse les caractères dans un tableau de manière incorrecte (cela fait un moment que je n'ai pas fait C comme ça. Pouvez-vous m'aider à trouver où je crée une boucle infinie?

J'ai mis à jour le code ci-dessus avec ce avec quoi je travaille maintenant. Notez que les principales modifications ont été apportées à ma fonction:

void tolayer5(int AorB, char data[])

Et cette ligne à l'intérieur de la fonction: printf("%c",msgReceived.data[i]); puisque maintenant c'est juste:

printf("%c",data[i]);
8
Katie Jurek

semble que vous devez créer un lien avec le fichier obj qui implémente tolayer5 ()

Mise à jour: votre déclaration de fonction ne correspond pas à l'implémentation:

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

Le compilateur les traiterait donc comme deux fonctions différentes (vous utilisez c ++). et il ne peut pas trouver l'implémentation de celle que vous avez appelée dans main ().

12
tristan

Comme indiqué par quelques autres, il s'agit d'une erreur de liaison. La section de code où cette fonction est appelée ne sait pas ce qu'est cette fonction. Il doit soit être déclaré dans un fichier d'en-tête défini dans son propre fichier source, soit défini ou déclaré dans le même fichier source, au-dessus de l'endroit où il est appelé.

Edit: Dans les anciennes versions de C, C89/C90, les déclarations de fonction n'étaient pas réellement requises. Ainsi, vous pouvez simplement ajouter la définition n'importe où dans le fichier dans lequel vous utilisez la fonction, même après l'appel et le compilateur déduirait la déclaration. Par exemple,

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

int func()
{
   return 1;
}

Cependant, ce n'est pas une bonne pratique aujourd'hui et la plupart des langages, C++ par exemple, ne le permettent pas. Une façon de vous éloigner de la définition de la fonction dans le même fichier source dans lequel vous l'utilisez est de la déclarer au début du fichier. Ainsi, l'exemple précédent ressemblerait à ceci à la place.

int func();

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

int func()
{
  return 1;
}
1
dsell002

Assurez-vous de déclarer la fonction tolayer5 en tant que prototype ou de définir la définition de fonction complète, plus tôt dans le fichier où vous l'utilisez.

1
Phillip Ngan