Search code examples
cargumentsfunction-pointersvoid-pointersincompatibility

function pointer and function is incompatible because of arguments


I have read the book Understanding and Using C Pointers and try to compile the code below. But after compiling I got the warning: assignment from incompatible pointer type.

I have checked the code and find out the function pointer fptrSet and function ShapeSetX is incompatible because the first argument of fptrSet is void * and function ShapeSetX is Shape *.

How can I fix this? Thanks!

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;
}

Solution

  • You have to respect pointer definition: pointer need that first parameter is a pointer to void, so your function implementation should have first parameter as void:

    void ShapeSetX(void *void_shape, int x){
        Shape *shape = (Shape*) void_shape;
        shape->x = x;
    }
    void ShapeSetY(void *void_shape, int y){
        Shape *shape = (Shape*) void_shape;
        shape->y = y;
    }
    int ShapeGetX(void *void_shape){
        Shape *shape = (Shape*) void_shape;
        return shape->x;
    }
    int ShapeGetY(void *void_shape){
        Shape *shape = (Shape*) void_shape;
        return shape->y;
    }