Как исправить ошибку «несовместимый тип указателя» в C?

#c #function #pointers

#c #функция #указатели

Вопрос:

У меня есть домашнее задание по указателям на функции и реализации наследования в C. Я получил ошибку «несовместимый тип указателя» в отношении Aralik, VerilenlerArasindan и Harfler. В чем проблема?

RastgeleKarakter.h

     struct RASTGELEKARAKTER{
        Random ran;
        char (*Harf)(struct RASTGELEKARAKTER*);
        char* (*Harfler)(struct RASTGELEKARAKTER*);
        char* (*Aralik)(struct RASTGELEKARAKTER*);
        char* (*VerilenlerArasindan)(struct RASTGELEKARAKTER*);
        char* (*Cumle)(struct RASTGELEKARAKTER*);
        void (*YokEt)(struct RASTGELEKARAKTER*);
    };

    typedef struct RASTGELEKARAKTER* RastgeleKarakter;

    RastgeleKarakter RastegeleKarakterOlustur();
    char RandomHarf(RastgeleKarakter);
    char* RandomHarfler(RastgeleKarakter,unsigned);
    char* RandomAralik(RastgeleKarakter,unsigned,char,char);
    char* RandomVerilenlerArasindan(RastgeleKarakter,unsigned,char*);
    char* RandomCumle(RastgeleKarakter);
    void RastgeleKarakterYokEt(RastgeleKarakter);
  

RastgeleKarakter.c

 RastgeleKarakter RastegeleKarakterOlustur(){

    RastgeleKarakter karakter;
    karakter = (RastgeleKarakter)malloc(sizeof(struct RASTGELEKARAKTER));
    karakter->ran = RandomOlustur();
    karakter->Harf = amp;RandomHarf;
    karakter->Harfler = amp;RandomHarfler;
    karakter->Aralik = amp;RandomAralik;
    karakter->VerilenlerArasindan = amp;RandomVerilenlerArasindan;
    karakter->Cumle = amp;RandomCumle;
    karakter->YokEt = amp;RastgeleKarakterYokEt;
    return karakter;
}
  

Комментарии:

1. Некоторые из ваших функций принимают больше аргументов, чем один RASTGELEKARAKTER* . Однако элементы структуры не определены таким образом.

2. И несвязанное примечание: хотя в Windows API их полно, использование псевдонимов типов указателей (например, для которых вы создаете RastgeleKarakter ) обычно является плохой идеей. Это затрудняет понимание кода и, следовательно, усложняет его обслуживание. И все это легко забыть, что псевдоним типа является указателем, и случайно использовать RastgeleKarakter* где-то, где его не должно быть.

3. Я буду иметь это в виду, спасибо.

Ответ №1:

предупреждение: присвоение несовместимого типа указателя [-Wincompatible-pointer-types] karakter->Harfler = amp;Randomarfler;

потому что

char* (Harfler)(struct RASTGELEKARAKTER);

но

char* RandomHarfler(RastgeleKarakter,unsigned);

RandomHarfler получает два аргумента, но Harfler должен получить указатель на функцию, получающую только struct RASTGELEKARAKTER*


предупреждение: присвоение несовместимого типа указателя [-Wincompatible-pointer-types] karakter->Aralik = amp;RandomAralik;

потому что

char* (Aralik)(struct RASTGELEKARAKTER);

но

char* RandomAralik(RastgeleKarakter,unsigned,char,char);

RandomAralik получает 4 аргумента, но Aralik должен получить указатель на функцию, получающую только struct RASTGELEKARAKTER*


предупреждение: присвоение несовместимого типа указателя [-Wincompatible-pointer-types] karakter->VerilenlerArasindan = amp;RandomVerilenlerArasindan;

потому что

char* (VerilenlerArasindan)(struct RASTGELEKARAKTER);

но

char* RandomVerilenlerArasindan(RastgeleKarakter,unsigned,char*);

RandomVerilenlerArasindan получает 3 аргумента, но VerilenlerArasindan должен получить указатель на функцию, получающую только struct RASTGELEKARAKTER*

Ответ №2:

Harfler Элемент объявляется указателем на функцию, которая принимает struct RASTGELEKARAKTER * :

 char* (*Harfler)(struct RASTGELEKARAKTER*);
  

но вы пытаетесь присвоить ему указатель на RandomHarf:

 karakter->Harf = amp;RandomHarf;
  

который объявляется указателем на функцию, которая принимает struct RASTGELEKARKTER * (через typedef RastgeleKarakter ) и unsigned :

 char* RandomHarfler(RastgeleKarakter,unsigned);
  

Указатель на функцию, которая принимает один параметр, несовместим с указателем на функцию, которая принимает два параметра.