2011-03-06 64 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