[英]Implicit declaration of function is invalid in 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()
在其他文件中] 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 int
的数组作为参数。
这里有几个问题:
正如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 <stdio.h>
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.