功能正常,但返回垃圾

时间:2011-06-03 18:42:19

标签: c function floating-point return-value

我有这个功能:

float calc_nnc(struct ImageWindow *window1, struct ImageWindow *window2) {
    /* More code */
    double numerator = (double) sum_a_x_b;
    double divisor = ( sqrt(sum_a) * sqrt(sum_b) );
    double result = numerator / divisor;
    float resultf = (float) result;

    printf("numerator: %lf, divisor: %lf, result: %lf, resultf: %f\n",
        numerator, divisor, result, resultf);

    return resultf;
}

printf打印出我期望看到的结果:

  

a x b = 1383,a = 1776,b = 4959
  分子:1383.000000,除数:2967.690011,结果:0.466019,结果:0.466019

但是,当我尝试在另一个函数中打印calc_nnc的结果时:

float nnc_likeness;
unsigned int x, y;

for (y = 0; y <= y_max; y++) {
    for (x = 0; x <= x_max; x++) {
        set_image_window(&window_big, big, x, y, width, height);
        nnc_likeness = calc_nnc(&window_small, &window_big);
        printf("likeness: %f\n", nnc_likeness);
    }
}

我得到了垃圾:

  

相似度:1055824384.000000

也就是说,我看到正确的值calc_nnc正在计算,但在此之后,我发现nnc_likeness的值已损坏。

知道发生了什么事吗?谢谢!

1 个答案:

答案 0 :(得分:8)

您可能在调用它的上下文中没有calc_nnc的原型,因此编译器认为其返回类型为int(根据规范)。快速测试计划:

#include <stdio.h>

union u {
  float f;
  int   i;
};

int main(int argc, char **argv)
{
  union u a;
  union u b;

  a.f = 0.466019;
  b.i = 1055824384;

  printf("%d %f\n", a.i, a.f);
  printf("%d %f\n", b.i, b.f);

  return 0;
}

给出这个输出:

1055824395 0.466019
1055824384 0.466019

添加一个正确的原型,告诉您的代码calc_nnc返回float并且您将全部设置完毕。提出更多警告也会抓住这个问题。