C99中隐含的函数声明无效

我是C语言的新手,我遇到了一个我真的不明白的问题。 我试图从另一个函数获取一个数组但是当我尝试提取信息时,它给了我以下警告:

函数’getk_vector_calculation’的隐式声明在C99中无效。数组初始值设定项必须是初始化列表或字符串文字

这是代码:

int k_vector_calculation(int krec[3]) { ... krec [0] = l*u[0]+m*v[0]+o*[0] ; krec [1] = l*u[1]+m*v[1]+o*[1] ; krec [2] = l*u[2]+m*v[2]+o*[2] ; return k_vector_calculation( &krec[3] ) } int main () { char krec[3] = getk_vector_calculation(&krec[3]); ... } 

在你的main() ,你调用的函数是getk_vector_calculation() [它不是k_vector_calculation() ] ,并且在使用之前没有declareddefined

要解决这个问题,

  1. #include包含getk_vector_calculation()文件中getk_vector_calculation()声明的头文件。 [考虑getk_vector_calculation()在其他文件中]
  2. 或者,在main()之前添加getk_vector_calculation()前向声明, getk_vector_calculation()在某处定义getk_vector_calculation()

要了解有关隐式声明的更多信息,可以查看此问题 。


编辑:

正如其他人指出的那样,您的代码段中还有许多问题。 但由于问题标题仅限于implicit declaration错误,IMO,这个答案应该是必要的。 剩余的错误完全是一个不同的方面。

在旧版本的C中,仍然可以调用尚未声明的函数,并且假设它们返回int并且使用了未指定数量的参数。 严格地说,在C99中,不允许在没有首先声明的情况下调用函数。

但是,在你的情况下,你试图调用一个名为getk_vector_calculation的函数,但你已经定义了一个名为k_vector_calculation的函数(开头没有get )。

您还尝试使用函数初始化数组,这是不允许的(在C中,函数不能返回数组)。 只需声明数组并将k_vector_calculation作为单独的语句调用,例如:

 int krec[3] = {0}; k_vector_calculation(krec); 

不要使用&krec[3]因为它指向无效的位置。 使用&krec[0]提供数组中第一个元素的地址,或者等效地只是krec 。 Nb也声明了一个char类型的数组,但是你的函数接受一个指向int的指针,这些类型是不兼容的。 您的函数也无条件地调用自身,因此如果剪切的代码没有有条件地返回,则保证无限递归。 如果您的函数不需要调用自身,并且它不返回任何重要性的值,请将返回类型更改为void以指示它没有返回值。

由于您使用的是C99,因此可以在函数的参数声明中使用static关键字:

 void k_vector_calculation(int krec[static 3]) { // ... other code here ... krec[0] = l*u[0]+m*v[0]+o*[0]; krec[1] = l*u[1]+m*v[1]+o*[1]; krec[2] = l*u[2]+m*v[2]+o*[2]; } 

上面的代码声明了一个函数,该函数将一个至少为 3的数组作为参数。

几个问题,这里:

  1. 正如Sourav Ghosh指出的那样,你定义了k_vector_calculation() ,然后尝试调用getk_vector_calculation() 。 你必须使用正确的名称。

  2. 你说你想“从另一个函数中获取数组” – 你不能在C中做到这一点。

  3. 你没有显示k_vector_calculation()所有代码,但是如图所示,这个函数将永远调用它自己,因为它做的最后一件事就是无条件地再次调用它自己。 如果你有一个递归函数,你需要给它一个终止的方法。

  4. &krec[3]是数组k的第四个元素的地址,这不是你想要做的,这里,特别是因为你的数组只包含3个元素。 要引用数组本身,只需使用krec

  5. char krec[3] = getk_vector_calculation(&krec[3]); 由于种种原因无效。 一,你不能在C中用这种方式初始化数组。二,参见第(4)点你的论点。 三,即使您可以在C中以这种方式初始化数组,您也会尝试将未初始化的数组传递给函数,在其中初始化它,然后尝试使用结果初始化原始数组。 这没有任何意义。

  6. 您还可以编写函数来处理int数组,但是将main()中的krec声明为char数组。

目前还不清楚你想要k_vector_calculation()做什么,但你不能像这样返回C中的数组。 可能你想要做的只是将数组传递给函数,让函数工作,并且什么也不返回。 例如:

 #include  void k_vector_calculation(int kvec[]) { kvec[0] = 1; kvec[1] = 2; kvec[2] = 3; } int main(void) { int kvec[3]; k_vector_calculation(kvec); for ( int i = 0; i < 3; ++i ) { printf("kvec[%d] is %d.\n", i, kvec[i]); } return 0; }