0

I wrote a function pointer that has all void* so that it can be used for any numeric value

  1. int
  2. float
  3. double.

But it is working only for the int addition function

For float and double addition functions, it throws compile time error. Why is that so ?

If you uncomment the last two printf lines, you would receive error

#include<stdio.h>

int int_add(int x, int y) {
    return x + y;
}

float float_add(float x, float y) {
    return x + y;
}

double double_add(double x, double y) {
    return x + y;
}
void* do_operation(void* (*op)(void*, void*), void* x, void* y) {
    return op(x, y);
}

void main(void) {

    printf("Sum= %d\n",(int*) do_operation(int_add, 1, 2));
    /*printf("Sum= %f\n",(float*) do_operation(float_add, 1.20, 2.50));*/
    /*printf("Sum= %lf\n",(double*) do_operation(double_add, 1.20, 2.50));*/
    
}

2 Answers 2

4

void * is a pointer type. You're not passing pointers, you're passing values, so that's not going to compile. It accidentally "works" for int because pointers themselves are represented as integers by most C compilers.

If you pass pointers to int, float, and double instead of the int, float, and double themselves, you will avoid that compiler error. You'd also need to change int_add and friends to take pointers, and you'd have to make sure you dereferenced the pointers before using them. You'll also have to return pointers, which means you'll have to malloc some memory on the heap, because the stack memory assigned to your local variables will be invalid once your function exits. You'll then have to free it all later... in the end, this is going to result in something considerably more complicated than the problem it appears you are trying to solve.

I have to ask why you are trying to do this? C is really not the best language for this type of pattern. I'd suggest just calling the int_add, float_add, etc. functions directly instead of trying to abstract them in this way.

Sign up to request clarification or add additional context in comments.

1 Comment

thank you. Rewrote the code as per your suggestion :-)
0

So as per @charles-srstka suggestion I rewrote the code and then it worked as I wanted

#include<stdio.h>
#include<stdlib.h>


int* int_add(int *x, int *y) {
    int *c = (int *)malloc(sizeof(int));
    *c = *(int*)x + *(int*)y;
    return c;
}

float* float_add(float *x, float *y) {
    float *c = (float*)malloc(sizeof(float));
    *c = *(float*)x + *(float*)y;
    return c;
}

void* do_operation(void* (*op)(void*, void*), void* x, void* y) {
    return op(x, y);
}

void main(void) {

    int a = 1;
    int b = 2;                                               
    int *c;
    c = do_operation(int_add, &a, &b);
    printf("%d\n",*c);
    free(c);

    float x = 1.1;                                               
    float y = 2.2;                                               
    float *z;
    z = do_operation(float_add, &x, &y);
    printf("%f\n",*z);
    free(z);
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.