C99中隐含的函数声明无效

时间:2014-11-25 12:15:42

标签: c arrays

我是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]); 

    ...

}

3 个答案:

答案 0 :(得分:2)

在您的main()中,您调用的函数为getk_vector_calculation() [不是k_vector_calculation()] 且不是declared或{{1在使用之前。

要解决此问题,

  1. 要么defined头文件包含你的文件中#include的声明。 [考虑getk_vector_calculation()在其他文件中]
  2. 或者,在getk_vector_calculation()之前添加getk_vector_calculation()的前瞻性声明,并在某处定义main()
  3. 要了解有关隐式声明的更多信息,您可以查看此question


    编辑:

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

答案 1 :(得分:0)

在旧版本的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。注:另外,您声明了一个类型为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

答案 2 :(得分:0)

这里有几个问题:

  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数组,但在krec中将main()声明为char的数组。

  7. 不清楚你想要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;
    }