我遇到错误
警告:函数Min的隐式声明在C99中无效[-Wimplicit-function-declaration]
在不触摸主电源的情况下尝试从3个输入中找到最小值的情况。
#include <stdio.h>
void minVal (double x, double y, double z, double minVal)
{
if (x<y && x<z)
minVal = x;
else if (y<x && y<z)
minVal = y;
else if (z<x && z<y)
minVal = z;
}
int main(void) {
double x, y, z, minVal;
printf("Please enter three numeric values: ");
scanf("%lf%lf%lf", &x, &y, &z);
minVal = Min(x, y, z);
printf("Min(%0.10f, %0.10f, %0.10f) = %0.10f\n", x, y, z, minVal);
return 0;
}
答案 0 :(得分:3)
当您的老师召集一位缺席的学生时,所有学生可能会大喊“他不在这里!”
让我们看看警告:
警告:函数'Min'的隐式声明在C99 [-Wimplicit-function-declaration]中无效
这意味着您正在尝试使用Min
而不在代码中声明它,这是不允许的。
这不是错误,而是警告,最终将导致链接器错误。
这里:
minVal = Min(x, y, z);
因此,您需要编写一个名为Min
的函数,或者需要用已经声明的某个函数替换Min
。例如,
void minVal (double x, double y, double z, double minVal)
现在,即使您将通话从Min
更改为minVal
,也无法使用。因为您的代码具有名为minVal
的函数和具有相同名称的变量。那是混乱的。养成不要使用相同名称声明变量和函数的方法。
此函数返回void
,并且您尝试确定以double
作为数据类型的3个输入中的最小值,并将值分配给作为参数传递的最后一个变量。可以,但与返回值相比不方便,对吧?
在不触摸主电源的情况下尝试从3个输入中找到最小值的情况。
我建议这样:
#include <stdio.h>
double Min(double x, double y, double z)
{
if (x<y && x<z)
return x;
else if (y<x && y<z)
return y;
else if (z<x && z<y)
return z;
else
return 0.0;
}
int main(void)
{
double x, y, z, minVal = 0.0;
printf("Please enter three numeric values: ");
scanf("%lf%lf%lf", &x, &y, &z);
minVal = Min(x, y, z);
printf("Min(%0.10f, %0.10f, %0.10f) = %0.10f\n", x, y, z, minVal);
return 0;
}
此代码对您的代码进行了以下更改:
Min
重命名为minVal
。请注意,通常最好将动词/动作用作函数名称,以使其易于解释函数的作用。因此,如果我有更改main()
函数的自由,我将在所有地方(声明和函数调用)使用名称Get_minValue
而不是Min
。Min
的返回类型更改为double
,以便我可以返回值而不是将其分配给参数。您仍然可以通过删除minVal
变量来使它更好,我会让您弄清楚:-)
另外,C99很旧,下次您编译代码时,请确保使用-std=c11 -pedantic-errors
对其进行编译。
Here,您可以找到有关编译器选项的更多信息。
答案 1 :(得分:0)
如消息所示,这是警告,不是错误。
您看到此消息是因为您正在调用函数Min
,该函数未在任何地方声明。虽然编译将成功(带有警告),但是由于未定义Min
,因此链接可能会失败。
您可能要调用的函数在代码中被命名为minVal
,而不是Min
。
但是,您不能像现在这样从minVal
调用main
,因为您还定义了一个名为minVal
的局部变量,该变量遮盖了函数名。要解决此问题,您必须重命名此变量:
double min;
...
min = minVal(x, y, z);
或者,重命名该函数:
void Min(double x, double y, double z, double minVal)
...
这将导致更多错误:
minVal
函数不返回值(其返回类型为void
)。minVal
函数使用4个参数,而不是3个参数(但它忽略了第4个参数)。最后一点值得进一步关注。在C函数中,参数是按值传递的,所以
f(x);
无法修改x
。同样,在minVal
中,最后一个参数(也称为minVal
)只是该参数的本地副本,因此对其赋值不会影响该函数。
您应该删除minVal
参数和return
一个值。
答案 2 :(得分:0)
简单:C语言不允许您调用未定义的函数(或宏)。在1999年用C语言进行了更改,这就是为什么它说“ C99”的原因。
为了解决此问题,您必须提供函数Min
。就是这样。
答案 3 :(得分:0)
您的问题已得到正确回答,想对使用void函数添加评论。
void minVal (double x, double y, double z, double minVal)
minVal最有可能返回最小值。在只有一个返回值的这个简单函数中,最佳选择的确是将代码更改为:
double minVal (double x, double y, double z, double minVal)
但是,如果您必须返回多个作为一个值,或者必须返回一个状态(例如,输入两个或三个相等的数字)和一个值怎么办?然后,您需要依靠按引用调用。在C语言中,指针是必经之路。
void minVal (double x, double y, double z, double* min)
{
if (x<y && x<z)
*min = x;
else if (y<x && y<z)
*min = y;
else if (z<x && z<y)
*min = z;
}
int main(void) {
double x, y, z, minValue;
printf("Please enter three numeric values: ");
scanf("%lf%lf%lf", &x, &y, &z);
minVal(x, y, z, &minValue);
printf("Min(%0.10f, %0.10f, %0.10f) = %0.10f\n", x, y, z, minValue);
return 0;
}
在这种情况下,使用&minValue将minValue的地址而不是minValue的值传递给minVal函数。在minVal函数中, min表示将值存储到double指向的地址 min。