J'ai lu le livre Comprendre et utiliser les pointeurs C et essayer de compiler le code ci-dessous. Mais après la compilation, j'ai reçu l'avertissement: affectation à partir du type de pointeur incompatible.le pointeur de fonction et la fonction est incompatible à cause des arguments
J'ai vérifié le code et trouver le pointeur de fonction fptrSet
et la fonction ShapeSetX
est incompatible parce que le premier argument de fptrSet est void *
et la fonction ShapeSetX est Shape *
.
Comment puis-je résoudre ce problème? Merci!
typedef void (*fptrSet)(void*, int);
typedef int (*fptrGet)(void*);
typedef void (*fptrDisplay)();
typedef struct _vfunc
{
fptrSet setX;
fptrGet getX;
fptrSet setY;
fptrGet getY;
fptrDisplay display;
} vFunc;
typedef struct _shape
{
vFunc function;
int x;
int y;
} Shape;
void displayShape(){
printf("Shape\n");
}
void ShapeSetX(Shape *shape, int x){
shape->x = x;
}
void ShapeSetY(Shape *shape, int y){
shape->y = y;
}
int ShapeGetX(Shape *shape){
return shape->x;
}
int ShapeGetY(Shape *shape){
return shape->y;
}
Shape *newShape()
{
Shape *shape = (Shape *)malloc(sizeof(Shape));
shape->x = 10;
shape->y = 10;
shape->function.setX = ShapeSetX;
shape->function.getX = ShapeGetX;
shape->function.setY = ShapeSetY;
shape->function.getY = ShapeGetY;
shape->function.display = displayShape;
return shape;
}
Je pense que vous pouvez également changer le 'typedef void (* fptrSet) (void *, int) 'à' typedef void (* fptrSet) (Shape *, int) 'et la même chose pour' fptrGet'. –
@KevinWallis Je pense qu'il veut quelque chose comme la table virtuelle de C++, donc parce qu'il n'y a pas d'héritage en C, il doit utiliser 'void' pour autoriser la structure" dérivée "de' Shape' – Garf365
@KevinWallis @ Garf365 a raison, comme vous voir ce code est essayer de simuler le vtable à partir de C++, donc l'argument doit être 'void *' – FatMouse