C99中隐式声明函数是无效的

4

我刚接触C语言,遇到了一个问题,但我真的不理解。我正在尝试从另一个函数中获取一个数组,但是当我尝试提取信息时,它给出以下警告:

C99中函数“getk_vector_calculation”的隐式声明无效 数组初始化程序必须是初始化列表或字符串文字

这是代码:

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个回答

6
在您的main()中,您调用的函数是getk_vector_calculation() [而不是k_vector_calculation()],但在使用它之前没有进行声明定义
要解决此问题,
  1. 要么在源文件中#include包含getk_vector_calculation()声明的头文件。[考虑到getk_vector_calculation()在其他文件中]
  2. 或者,在main()之前添加getk_vector_calculation()的前向声明,并在某处定义getk_vector_calculation()
要了解更多关于隐式声明的信息,您可以查看这个问题

编辑:

正如其他人指出的那样,您的代码片段中存在许多其他问题。但由于问题标题仅限于implicit declaration错误,所以我认为这个答案应该足够了。其余的错误是完全不同的方面。


1
指出 char krec[3] = getk_vector_calculation(&krec[3]); 是完全无效的也会很有帮助。 - Crowman
谢谢,但我应该怎样改写它呢? - B.T.

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元素的数组作为参数。

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数组,但在main()中声明krecchar数组。

不清楚您想让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;
}

感谢您的解释,非常感激。 - B.T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接