У меня есть домашняя работа по указателям функций и реализации наследования в 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 = &RandomHarf;
karakter->Harfler = &RandomHarfler;
karakter->Aralik = &RandomAralik;
karakter->VerilenlerArasindan = &RandomVerilenlerArasindan;
karakter->Cumle = &RandomCumle;
karakter->YokEt = &RastgeleKarakterYokEt;
return karakter;
}
И несвязанное примечание: хотя в Windows API их полно, использование псевдонимов типов указателей (таких, как вы создаете для RastgeleKarakter), как правило, плохая идея. Это затрудняет понимание кода и, следовательно, его труднее поддерживать. И легко забыть, что type-alias — это указатель, и случайно использовать RastgeleKarakter* где-то там, где его быть не должно.
Я буду иметь это в виду, спасибо.





warning: assignment from incompatible pointer type [-Wincompatible-pointer-types] karakter->Harfler = &RandomHarfler;
потому что
char* (Harfler)(struct RASTGELEKARAKTER);
но
char* RandomHarfler(RastgeleKarakter,unsigned);
RandomHarfler получает два аргумента, но Харфлер должен получить указатель на функцию, получающую только struct RASTGELEKARAKTER*
warning: assignment from incompatible pointer type [-Wincompatible-pointer-types] karakter->Aralik = &RandomAralik;
потому что
char* (Aralik)(struct RASTGELEKARAKTER);
но
char* RandomAralik(RastgeleKarakter,unsigned,char,char);
Случайный Аралик получает 4 аргумента, но Аралик должен получить указатель на функцию, получающую только struct RASTGELEKARAKTER*
warning: assignment from incompatible pointer type [-Wincompatible-pointer-types] karakter->VerilenlerArasindan = &RandomVerilenlerArasindan;
потому что
char* (VerilenlerArasindan)(struct RASTGELEKARAKTER);
но
char* RandomVerilenlerArasindan(RastgeleKarakter,unsigned,char*);
RandomVerilenlerArasindan получает 3 аргумента, но ВериленлерАрасиндан должен получить указатель на функцию, получающую только struct RASTGELEKARAKTER*
Член Harfler объявляется указателем на функцию, которая принимает struct RASTGELEKARAKTER *:
char* (*Harfler)(struct RASTGELEKARAKTER*);
но вы пытаетесь присвоить ему указатель на RandomHarf:
karakter->Harf = &RandomHarf;
который объявлен как указатель на функцию, которая принимает struct RASTGELEKARKTER * (через typedefRastgeleKarakter) и unsigned:
char* RandomHarfler(RastgeleKarakter,unsigned);
Указатель на функцию, принимающую один параметр, несовместим с указателем на функцию, принимающую два параметра.
Некоторые из ваших функций принимают больше аргументов, чем одна
RASTGELEKARAKTER*. Однако члены структуры не определены таким образом.