9

我正在制作一个可靠的数据传输协议并拥有功能原型

void tolayer5(int, char data[]);

随着structs

struct msg {
  char data[20];
};

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

当我以这种格式调用函数时:

tolayer5(A, packet.payload);

Aanintpacket.payload是 a在哪里struct pkt,我收到错误“未定义对 的引用'tolayer5(int, char*)'。你能帮我看看我在这里缺少什么吗?

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

感谢大家对原始问题的帮助!:) 但是,在尝试修复该问题时,我遇到了一个无限循环,我认为这与我错误地寻址数组中的字符有关(自从我这样做以来已经有一段时间了C。你能帮我找到我在哪里创建一个无限循环?

我已经将上面的代码更新为我现在正在使用的代码。请注意,我的功能发生了主要变化:

void tolayer5(int AorB, char data[])

而函数内部的这一行:printf("%c",msgReceived.data[i]);因为现在它只是:

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

3 回答 3

13

看来你需要链接实现 tolayer5() 的 obj 文件

更新:您的函数声明与实现不匹配:

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

因此编译器会将它们视为两个不同的函数(您使用的是 c++)。它找不到您在 main() 中调用的那个的实现。

于 2013-10-16T01:18:28.983 回答
1

正如其他一些人所说,这是一个链接错误。调用此函数的代码部分不知道此函数是什么。它要么需要在头文件中声明并在其自己的源文件中定义,要么在同一个源文件中定义或声明,高于它被调用的位置。

编辑:在旧版本的 C、C89/C90 中,实际上并不需要函数声明。因此,您可以在使用函数的文件中的任何位置添加定义,即使在调用之后,编译器也会推断出声明。例如,

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

int func()
{
   return 1;
}

然而,这在今天并不是很好的做法,大多数语言,例如 C++,都不允许这样做。在您使用它的同一源文件中定义函数的一种方法是在文件的开头声明它。因此,前面的示例将看起来像这样。

int func();

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

int func()
{
  return 1;
}
于 2013-10-16T01:30:49.313 回答
1

确保将 tolayer5 函数声明为原型,或在使用它的文件的前面定义完整的函数定义。

于 2013-10-16T01:21:58.377 回答