繁体   English   中英

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

[英]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() ] ,并且在使用前未declareddefined

为了解决这个问题,

  1. 在您的源文件中#include包含getk_vector_calculation()声明的头文件。 [考虑到getk_vector_calculation()在其他文件中]
  2. 或者,在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的数组作为参数。

这里有几个问题:

  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()中将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM