代码之家  ›  专栏  ›  技术社区  ›  Rohit Pandey

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

  •  3
  • Rohit Pandey  · 技术社区  · 10 年前

    我肯定我在这里遗漏了一些明显的东西,但就是弄不清是什么 my repository ,我有一个名为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。我肯定遗漏了一些显而易见的东西,但我想不出是什么。

    P.S.我使用同一目录中的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);
    }
    
    1 回复  |  直到 10 年前
        1
  •  3
  •   Art    10 年前

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

    C标准规定:

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

    正确的解决方案是:

    1. 始终具有正确的功能原型。
    2. 始终在编译中启用所有警告并将其视为错误。
    推荐文章