C程序错误“'功能'的冲突类型”

时间:2016-03-01 23:31:01

标签: c pointers

处理一个项目,并试图理解我为什么会收到我得到的错误。我还是C的新手,这对我来说是一场挣扎。我在这个主题上打开了40或50个标签,试图解决我的问题,但无济于事。

我的错误消息位于main之前,我在这个项目中使用了我提供的函数的原型。该函数名为utf8_to_codepoint,它很好..将utf8值转换为Unicode代码点值。

目前唯一的错误在于我的原型声明:“'utf8_to_codepoint'的冲突类型”

我尝试了许多不同的东西,涉及指针,不涉及指针,包括'const'和'unsigned'关键字等,没有任何东西使错误消失。

我仍在努力使用指针,我不确定为什么这个函数将指针作为其'参数。从我所看到的,该函数一次只能使用一个字符(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;
}

2 个答案:

答案 0 :(得分:3)

你声明你的功能如下:

int utf8_to_codepoint(char, int *);

但是这样定义:

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

返回类型不匹配,并且第一个参数的类型不匹配。

将声明更改为:

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 :(得分: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

您需要弄清楚哪些是正确的声明并替换另一个。