2011-03-06 33 views
1

好的。这是我遇到的最奇怪的错误之一。我有这两条线在我的代码if(id == 1)printf(“%i”,id)打印一些随机值

int id=i*2000*512+512*row+column; 
if (id==1){printf("This is output %f %f %f %i \n",entire_red[id],entire_green[id],entire_blue[id],id);} 

,这让我的输出

这是输出0.000000 0.000000 0.000000 109456488.

我不知道发生了什么事!

+4

“whole_red”,“entire_green”和“entire_blue”的类型是什么?如果它们不是浮点类型,那么这就是你的问题。 – dreamlax 2011-03-06 21:33:25

+0

什么是'whole_red'等?他们是“double”还是“float”的数组? – 2011-03-06 21:34:37

+0

@dreamlax:问题是为什么'id == 1'在打印时显示为'109456488' – 2011-03-06 21:34:38

回答

6

%f格式说明期望一个doublefloat隐式转换为double可变参数的函数)。如果variable_red等不是floatdouble变量,则printf将错误地处理参数,这可以解释为什么id整数打印不正确。

试试这个:

if (id==1) 
    printf("This is output %f %f %f %i\n", (double)entire_red[id],(double)entire_green[id],(double)entire_blue[id],id); 

或者,确保使用正确的格式说明的entire_redentire_greenentire_blue变量。

+0

谢谢all.I whole_red /绿色/蓝色作为int数组,并使用%f。现在我纠正回到%我,它工作正常。 – Manish 2011-03-06 21:59:36

+0

我相信这是一个正确的可能的解释。注意'K&R'中的函数原型并传递符合函数声明的参数类型。堆叠错位是这种情况的常见副作用。 – 2011-03-06 22:07:58

0

您是否包含stdio.h?如果不这样做,编译器可能会选择一个不符合printf的调用约定,该约定会选取“随机”值。

+1

尽管我没有执行-1,但如果OP没有包含'stdio.h',那么在使用'printf'时编译器错误肯定会占上风。 – Mahesh 2011-03-06 21:41:27

+0

我真的不明白倒票。我已经花了14年的时间为嵌入式世界编写C编译器。如果不包含'stdio.h',编译器会认为它是一个Kernighan&Richie函数,并相应地传递参数,通常在处理器寄存器中。由于'printf'采用可变数量的参数,因此通常会希望在堆栈中找到它的参数。 – Lindydancer 2011-03-06 23:23:52

+0

@Mahesh:与C++不同,在C中调用函数而不声明它是合法的,因此编译器至多应该发出警告。 – Lindydancer 2011-03-07 00:13:27

-1

%i正在打印错误的值,因为%i正在等待指向整数的指针地址。 所以你必须通过&id而不是id

我认为printf格式的其余部分已被其他答案描述。

+1

'%i'等同于'%d';它不需要指针。 – 2011-03-06 21:53:11

+0

哦,我的坏。我误会了scanf ......愚蠢的我。 – 2011-03-06 21:57:03

+0

%i是有符号整数的格式。我不相信这个答案是正确的。 – 2011-03-06 22:02:37