C函数float参数在函数内部采用不同的值

C函数float参数在函数内部采用不同的值,c,function,C,Function,我确信我在这里遗漏了一些明显的东西,但就是不知道它是什么。在中,我有一个名为ddpoly_2.c的文件,其中包含一个名为“ddpoly2”的函数。我从tst5.c中的main函数调用这个函数。如果您查看tst5_2.c中的代码,我将为x赋值2,立即打印它,然后将其作为第三个参数传递给“ddpoly2”(据我所知,这与调用模式应该是什么样的)。然后,我立即从函数“ddpoly2”中打印x。我看到的是: x outside: 2.000000 x inside : 0.000000 nc: 2 nd

我确信我在这里遗漏了一些明显的东西,但就是不知道它是什么。在中,我有一个名为ddpoly_2.c的文件,其中包含一个名为“ddpoly2”的函数。我从tst5.c中的main函数调用这个函数。如果您查看tst5_2.c中的代码,我将为x赋值2,立即打印它,然后将其作为第三个参数传递给“ddpoly2”(据我所知,这与调用模式应该是什么样的)。然后,我立即从函数“ddpoly2”中打印x。我看到的是:

x outside: 2.000000
x inside : 0.000000
nc: 2
nd: 3
您可以看到,就在调用函数之前,x是2.000000,但在函数内部,它变成了0.0000000。我肯定错过了一些明显的东西,但我想不出是什么

另外,我使用同一目录中的makefile编译代码

编辑:此处包含代码的相关部分

调用tst5_2.c中的函数:

int main(int argc, char *argv[])
{
//Used to determine which section gets its results printed.

    float c[] = {1,1,1,0,0};
    int nc = 2;
    float x = 2.0;
    float pd[] = {0,0,0,0,0};
    int nd = 3;
    printf("x outside: %f\n",x);
    ddpoly2(c,nc,x,pd,nd);      
}
在函数ddpoly2内打印它:

#include <stdio.h>

void ddpoly2(float c[], int nc, float x, float pd[], int nd)
{
    int nnd, j, i;
    float cnst = 1.0;
    printf("x inside : %f\n",x);
    printf("nc: %d\n",nc);
    printf("nd: %d\n",nd);
}
#包括
无效ddpoly2(浮点c[],整数nc,浮点x,浮点pd[],整数nd)
{
int nnd,j,i;
浮动cnst=1.0;
printf(“x内:%f\n”,x);
printf(“nc:%d\n”,nc);
printf(“nd:%d\n”,nd);
}

您正在调用一个没有原型的函数。自1999年以来,这是非法的,但您的编译器很有帮助,并允许与旧的C标准兼容

C标准规定:

如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数执行整数提升,并将具有float类型的参数提升为double

正确的解决办法是:

  • 始终具有正确的功能原型
  • 始终启用编译中的所有警告,并将其视为错误

  • 请在问题本身中包含您所指的实际代码。请提供一个示例。您还可以显示对函数的实际调用吗?@JoachimPileborg:Added-很抱歉遗漏了这一点。是否在单独的源文件中定义了
    ddpoly
    main
    ?如果是,请重新编译所有内容。因为,如果它们位于单独的文件中,则有可能:1)在某个点上,您使用另一个参数列表创建了
    ddpoly
    函数;2) 您使用
    ddpoly
    将源代码编译到目标文件中;3) 您修改了
    ddpoly
    的定义/声明,但没有重新编译其源文件;4) 您编译了主源文件;5) 您已将ddpoly对象文件(使用旧声明)与新的主对象文件链接。
    -Wall-Wextra-Werror-pedantic
    应该始终位于您的命令行上。我听说用C编程就像同时进行剑术和滑冰。我现在明白为什么了。