2016-03-01 47 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

您需要弄清楚哪些是正确的声明并替换其他。