2014-11-25 759 views
0

我是C语言的新手,我遇到了一个我实际上不理解的问题。我想从另一个功能的阵列,但是当我尝试提取信息,它给了我以下警告:函数的隐式声明在C99中无效

的功能“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]); 

    ... 

} 

回答

2
main()

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

要解决这个问题,

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

要了解更多关于隐式声明的内容,可以查看这个question


编辑:

正如其他人所指出的那样,在您的代码段更多问题。但由于问题标题仅限于implicit declaration错误,IMO认为此答案应该满足需要。其余的错误完全是一个不同的方面。

+1

指出'char krec [3] = getk_vector_calculation(&krec [3]);'是完全无效的也是有帮助的。 – 2014-11-25 12:27:28

+0

谢谢,但我该如何写呢? – 2014-11-25 12:29:52

0

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

对于您的情况,您尝试调用一个名为getk_vector_calculation的函数,但是您已经定义了一个名为k_vector_calculation(在开头为)的函数。

你也试图用函数初始化一个数组,这是不允许的(在C中,函数不能返回数组)。简单地声明数组并调用k_vector_calculation作为一个单独的语句,例如:

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

不要使用&krec[3],因为这指向一个无效的位置。使用&krec[0]来提供数组中第一个元素的地址,或者相当于krec会做的。注:还声明了一个类型为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

0

几个问题,在这里:

  1. 由于Sourav戈什指出,定义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. 您也写你的函数在main()int阵列工作,但声明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; 
} 
+0

谢谢你的解释,非常感谢 – 2014-11-25 13:07:59

相关问题