2016-03-01 54 views
0

在一個項目上工作,並試圖理解爲什麼我得到我得到的錯誤。我對C還是一個新手,這對我來說是一場艱苦的鬥爭。我在這個主題上打開了40或50個標籤,試圖解決我的問題,但無濟於事。C程序錯誤「功能'的衝突類型」

我的錯誤消息位於main函數的原型之前,我爲這個項目提供了一個函數。該函數稱爲utf8_to_codepoint,它很好地將utf8值轉換爲Unicode碼值。

目前我得到的謊言與我的原型語句的唯一錯誤:「衝突的類型‘utf8_to_codepoint’」

我已經嘗試了許多不同的事情,涉及到指針,不涉及指針,包括「常量」和'無符號'的關鍵字等,並沒有任何東西使錯誤消失。

我仍然在努力與指針,我不確定爲什麼這個函數指針作爲其參數。從我所能看到的情況來看,函數只能在一個時間(u)使用一個字符,而我不明白第二個參數的作用。

下面是我對函數的原型,我對函數的調用以及對utf8_to_codepoint函數的代碼。

int utf8_to_codepoint(char, int *); 

int main(int argc, char **argv) 
{ 
    char sampleText[3000]; 
    int lenptr = 3000; 
    ... 


    for(int i = 0; fgets(sampleText, 3000, fp) != NULL; i++) 
    { 
     int temp; 
     temp = utf8_to_codepoint(sampleText[i], &lenptr); 
     ... 
    } 

UTF8_To_Codepoint功能

extern unsigned int utf8_to_codepoint(const unsigned char *u, 
             int *lenptr) { 
    // Returns 0 if something goes wrong 
    // Passes back the length 
    unsigned int cp = 0; 

    *lenptr = 0; 
    if (u) { 
     if (*u < 0xc0) { 
     cp = (unsigned int)*u; 
     *lenptr = 1; 
     } else { 
     *lenptr = isutf8(u); 
     if (*lenptr == 0) { 
      return 0; 
     } 
     switch (*lenptr) { 
      case 2: 
       cp = (u[0] - 192) * 64 + u[1] - 128; 
       break; 
      case 3: 
       cp = (u[0] - 224) * 4096 
        + (u[1] - 128) * 64 + u[2] - 128; 
       break; 
      default: 
       cp = (u[0] - 240) * 262144 
        + (u[1] - 128) * 4096 
        + (u[2] - 128) * 64 + u[3] - 128; 
       break; 
     } 
     } 
    } 
    return cp; 
} 
+0

錯誤說明了一切。您的utf8_to_codepoint原型與實際函數定義不同。 –

+0

第二個參數/參數是寬度或數字位數,將與1至3一起使用,因此如果轉換爲十六進制,則將0轉換爲999或0至255。 –

+0

第二個參數指向的值在函數中設置。把它看作是一個「out」參數。它會告訴你用多少個字符來生成碼點。 –

回答

3

你聲明你的函數是這樣的:

int utf8_to_codepoint(char, int *); 

而是將其定義是這樣的:

unsigned int utf8_to_codepoint(const unsigned char *u, 
            int *lenptr) { 

的返回類型不匹配,以及t的類型他第一個說法不符合。

更改聲明如下:

unsigned int utf8_to_codepoint(const unsigned char *u, int *lenptr); 

並更改電話:

lenptr = 0; 
.... 
for(int i = 0; fgets(sampleText, 3000, fp) != NULL; i += lenptr) 
{ 
    int temp; 
    temp = utf8_to_codepoint(&sampleText[i], &lenptr); 
    ... 
} 
1

類型的功能,顯然不匹配:

原型是

int utf8_to_codepoint(char, int *); 

當你定義功能

extern unsigned int utf8_to_codepoint(const unsigned char *u, int *lenptr); 

專門unsigned int!= intconst unsigned char *!= char

您需要弄清楚哪些是正確的聲明並替換其他。