2012-10-20 100 views
4

我正在創建一個程序,將二進制,十進制,十六進制和十進制轉換爲其中任何一個選項。對於十六進制,我需要一種方法來將大於9的值格式化爲A,B,C,D,E,F中的一個。由於這將在若干功能中重複,因此我決定做出以下功能:接收「錯誤:'功能'衝突類型」

char hexRepresentation(double n){ 
    if(n > 9){ 
     if(n==10) return 'A'; 
     if(n==11) return 'B'; 
     if(n==12) return 'C'; 
     if(n==13) return 'D'; 
     if(n==14) return 'E'; 
     if(n==15) return 'F'; 
    } 

    return (char)n; 
} 

然而,當我嘗試編譯,我收到錯誤

conflicting types for 'hexRepresentation'

我位於C完全新的,從Java來了,我敲我的頭靠在牆上了什麼應該是容易實現的事情。任何幫助將不勝感激!

+2

會是什麼回報,如果你在5.6過去了?甚至10以下的整數值? '(char)5'不是'5'''。 – chris

+1

除了有問題的決定讓它接受'雙',你在使用之前是否聲明瞭這個函數?如果您來自Java,您可能已經忘記了這一點。 –

+0

我現在甚至不關心這一點。我將n作爲其他函數的雙精度 - 特別是來自math.h的pow()。到目前爲止,我只使用整數。 –

回答

9

你不會得到一個聲明類型的錯誤,因爲在C中,當你不轉發聲明一個函數時,大多數編譯器會假設一個返回int類型的extern函數。實際上,編譯器應該警告你(大部分都是這樣)。然後,當編譯器實際到達函數實現時,它會發現不同的返回類型,在這種情況下是char,然後拋出「衝突類型」錯誤。只是向前宣佈所有的功能,以避免這種錯誤。

關於什麼是最好的辦法財產以後像下面的代碼woudl產生類似的結果:

if (n > 9) 
{ 
    return('A' + (n - 10)); 
} 
0

只需創建一個具有推送和彈出功能的堆棧(用於字符)。我沒有返回值,只是在相同的函數中打印它。 (僅爲積分值實施)

#define max 100 
char a[max]; 

void hex(int n) 
{ 
while(n>0) 
{ 
int rem = n%16; 
if (rem<10) 
    push(rem+'0'); 
elsif(rem >=10 && rem <16) 
    { 
    switch(rem) 
    { 
     case 10: 
     push('A');break; 
     case 11: 
     push('B');break; 
     case 12: 
     push('C');break; 
     case 13: 
     push('D');break; 
     case 14: 
     push('E');break; 
     case 15: 
     push('F');break; 
    } 
    else 
     n=n/16; 
    } 
    } 
    i=0; 
    while(top>-1) 
    a[i++]=pop(); 
    i=0; 
    while(a[i]!='\0') 
    printf("%c",a[i++]); 
} 

它有幫助嗎?

1

無論你在代碼中做的貼出來,不使用double數據類型在所有的函數中。並且從函數返回類型看來,您將永遠不會看到返回值> 127。

該代碼突出了一些問題:(這只是舉例)

char hexRepresentation(double n){ 
    if(n > 9){//comparing (double>int). Bad. 
     if(n==10) return 'A'; 
     if(n==11) return 'B'; 
     if(n==12) return 'C';//You wrote if(double == int). Bad. 
     if(n==13) return 'D'; 
     if(n==14) return 'E'; 
     if(n==15) return 'F'; 
    } 

    return (char)n; //again unsafe downgrade from 8 bytes double to 1 byte char. 
} 

即使你解決您的編譯器錯誤,你可能不會得到想要的結果總是,由於函數數據類型的這種危險用法。

知道爲什麼它的壞,看這裏:

http://www.cygnus-software.com/papers/comparingfloats/Comparing%20floating%20point%20numbers.htm

我會在函數體中使用fabs(n),而不是n無處不在。

如果在此函數定義之前存在相同命名函數hexRepresentation的預先聲明或定義,則會顯示錯誤「'hexRepresentation'的衝突類型''。另外,如果你沒有聲明一個函數,它只會在被調用後出現,編譯器會自動假定爲int

因此,在main()之前聲明並定義你的函數或者在main()之前聲明並在文件的其他地方定義函數,但是使用相同的函數原型。

做:

char hexRepresentation(double); //Declaration before main 
main() 
{ 
    ... 
} 
char hexRepresentation(double n){//Definition after main 
... 
} 

或者

char hexRepresentation(double n){ //Declaration and definition before main 
    ... 
} 

main() 
{ 
    ... 
}