“监视”调试工具上的错误值

时间:2014-06-19 16:40:51

标签: c debugging codeblocks watch

当我使用实际值(float和double类型)编写程序时,我正在努力解决一些错误。 当将“real”声明为double时,在watch调试工具中,相对于此变量的值不会以易于理解的方式显示。此外,该程序没有给我正确的输出,我想知道为什么。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,integer;
    double real = 0;
    double average = 0;

    printf("enter a real value: ");
    scanf("%f",&real);

    for (i=0; average < real; i++){

        printf("enter an integer: ");
        scanf("%d",&integer);
        average = float((average+integer)/(i+1));
    }
    printf("\n%d numbers have been added!", i);
    printf("\nthe average of all entered numbers is: %.2f",average);

    return 0;
}

有些变量无法对应,因为我现在已将其翻译过来,以便让您更容易理解。

我尝试过使用强制转换操作符,删除它们,在声明中使用float和double得不到可接受的结果(并且程序也不起作用)

编辑: 程序现在正在运行,但仍然有一些数学问题,结果不是我期待的那个http://i.stack.imgur.com/Zl9dJ.jpg

1 个答案:

答案 0 :(得分:1)

当我使用GCC编译代码时,我得到了这个:

gcc -Wall -std=gnu99 -Wextra -Werror -g -O3 -o q q.c
cc1: warnings being treated as errors
q.c: In function ‘main’:
q.c:10:5: error: format ‘%f’ expects type ‘float *’, but argument 2 has type ‘double *’
q.c:16:19: error: expected expression before ‘float’
make: *** [q] Error 1

这些警告标志很有用。要修复第10行的错误,请使用“%lf”,如评论所述。

第16行的错误是因为float不是函数。你可以使用这样的类型转换:

average = (float)((average+integer)/(i+1))

但是这只是将结果转换为浮点数。如果您想实际使用浮点数学而不是整数数学转换为浮点数,则需要浮点操作数。最简单的方法是使用浮点文字:

average = (average+integer)/(i+1.0)

实际上,由于平均值已经是一个双倍,所以无论如何你都会用这个表达式进行浮点数学运算。虽然正如gnometorule在评论中指出的那样,这可能不是你想要做的计算。您可能希望建立所有输入数字的总和,然后除以最后输入的数字。这样可以得到你的意思。

您还想在最后一次打印结束时打印换行符:

printf("\nthe average of all entered numbers is: %.2f\n",average);

说到调试,我不了解Watches,但是gdb这样做:

(gdb) p real
$1 = 7.2999999999999998
(gdb) p average
$3 = 121.14920634920635

您可能希望在关闭优化的情况下进行编译,以便在调试器中获得更完整的信息,但是双打应该打印出来就好了。如果你正在查看包含它们的内存,你需要查看[IEEE 754]。