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()
] ,并且在使用之前没有declared
或defined
。
要解决这个问题,
-
#include
包含getk_vector_calculation()
文件中getk_vector_calculation()
声明的头文件。 [考虑getk_vector_calculation()
在其他文件中] - 或者,在
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的数组作为参数。
几个问题,这里:
-
正如Sourav Ghosh指出的那样,你定义了
k_vector_calculation()
,然后尝试调用getk_vector_calculation()
。 你必须使用正确的名称。 -
你说你想“从另一个函数中获取数组” – 你不能在C中做到这一点。
-
你没有显示
k_vector_calculation()
所有代码,但是如图所示,这个函数将永远调用它自己,因为它做的最后一件事就是无条件地再次调用它自己。 如果你有一个递归函数,你需要给它一个终止的方法。 -
&krec[3]
是数组k
的第四个元素的地址,这不是你想要做的,这里,特别是因为你的数组只包含3个元素。 要引用数组本身,只需使用krec
。 -
char krec[3] = getk_vector_calculation(&krec[3]);
由于种种原因无效。 一,你不能在C中用这种方式初始化数组。二,参见第(4)点你的论点。 三,即使您可以在C中以这种方式初始化数组,您也会尝试将未初始化的数组传递给函数,在其中初始化它,然后尝试使用结果初始化原始数组。 这没有任何意义。 -
您还可以编写函数来处理
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; }