簡體   English   中英

收到“錯誤:'功能'的沖突類型”

[英]Receiving “error: conflicting types for 'function'”

我正在創建一個程序,從二進制,十進制,十六進制和八進制轉換為任何一個選項。 對於hex,我需要一種方法將大於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;
}

但是,當我嘗試編譯時,我收到錯誤

'hexRepresentation'的沖突類型

我完全是C的新人,來自Java,並且正在抨擊我應該做的最簡單的事情。 任何幫助將不勝感激!

你沒有得到一個聲明類型的錯誤,因為在C中,當你不轉發聲明函數時,大多數編譯器都假設一個返回int類型的extern函數。 實際上編譯器應該警告你(大多數情況下)。 然后,當編譯器實際到達函數實現時,它會找到不同的返回類型,在本例中為char,然后拋出“沖突類型”錯誤。 只需向前聲明所有函數以避免此類錯誤。

關於什么是最好的方式,像下面的代碼woudl產生類似的結果:

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

無論你在發布的代碼中做了什么,你都沒有在函數中使用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()
 {
    ...
 }

只需創建一個具有推送和彈出功能的堆棧(用於char)。 我沒有返回值只是在同一個函數中打印它。 (僅針對整數值實現)

#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++]);
}

有用嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM