#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);
Указатель на функцию, которая принимает один параметр, несовместим с указателем на функцию, которая принимает два параметра.