2016-03-01 2 views
0

Работа над проектом и попытка понять, почему я получаю ошибки, которые получаю. Я все еще новичок в C, и это было для меня борьбой. Я открыл буквально 40 или 50 вкладок на эту тему, чтобы попытаться исправить мою проблему, но безрезультатно.C Ошибка программы «Конфликтующие типы для функции»

Мое сообщение об ошибке лежит перед основным, где я прототип функции, которую я предоставил для использования в этом проекте. Эта функция называется 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; 
} 
+0

Ошибка говорит все. Ваш прототип utf8_to_codepoint отличается от определения реальной функции. –

+0

Второй аргумент/параметр - это ширина или количество цифр, будет работать от 1 до 3, поэтому будет конвертировать 0 до 999 или от 0 до 255, если преобразование в шестнадцатеричное. –

+0

Значение, указанное вторым параметром, устанавливается в функции.Подумайте об этом как о «вне» параметре. Он сообщает вам, сколько символов u используется для генерации кода. –

ответ

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! = int и const unsigned char *! = char.

Вам нужно выяснить, какие из них являются правильной декларацией и заменить другую.

Смежные вопросы