变量不带任何值(c)

时间:2017-06-15 02:37:19

标签: c

我可能是一个愚蠢的事情,但我没有看到,但我的节目中有一个非常奇怪的行为。

这是我的代码

#include <stdio.h>
void spectral_color(double r,double g,double b,double l); //https://stackoverflow.com/a/22681410

int main(int argc, char **argv)
{
    double r,g,b;
    spectral_color(r,g,b,600);
    //printf("%lf,%lf,%lf",r,g,b);
}

void spectral_color(double r,double g,double b,double l) // RGB <0,1> <- lambda l <400,700> [nm]
    {
    double t;  r=0.0; g=0.0; b=0.0;
    if ((l>=595.0)&&(l<650.0)) { 
        t=(l-595.0)/(650.0-595.0); 
        r=(double)0.98+(0.06*t)-(0.40*t*t); 
    }
    printf("%lf,%lf,%lf",r,g,b);
}

打印0.000000,0.000000,0.000000,我在gdb

中尝试了这个
15          t=(l-595.0)/(650.0-595.0); 
(gdb) p l
$8 = 600
(gdb) p r
$9 = 1.7802772279180279e-307
(gdb) p t
$10 = 2.4846118548532686e+264
(gdb) n
16          r=(double)0.98+(0.06*t)-(0.40*t*t); 
(gdb) p t
$11 = 0.090909090909090912
(gdb) p r
$12 = 1.7802772279180279e-307
(gdb) n
18      printf("%lf,%lf,%lf",r,g,b);
(gdb) p t
$13 = 0.090909090909090912
(gdb) p r
$14 = 1.7802772279180279e-307

在这里,r没有采取它应该的值,我不知道为什么会这样做。 有人有解释吗?

提前致谢

编辑:

我将r的值传递给另一个变量,并将%lf更改为%f, 结果是r永远不会等于新变量,但正确的值最终会出现在这个新变量中

double d = r; //this is line 18
printf("%f,%f,%f",d,g,b);

gdb结果:

20  }
(gdb) p d
$1 = 0.98214876033057852
(gdb) p r
$2 = 1.7802772279180279e-307
(gdb)

1 个答案:

答案 0 :(得分:-1)

在我阅读manual

之前,我一直困扰这个问题

这是l长度修饰符

的解释

(ell) A following integer conversion corresponds to a long int or unsigned long int argument, or a following n conversion corresponds to a pointer to a long int argument, or a following c conversion corresponds to a wint_t argument, or a following s conversion corresponds to a pointer to wchar_t argument.

也许图片可能更具说明性 enter image description here

如果对l使用double的长度修饰符,则会执行类型提升或转换。这可能是你混淆的原因。