user1118686
user1118686

Reputation: 133

Functions in struct in c only

I am having a hard time compiling this C code.

Basically what happens is:

GNU99 and -fnested-functions flag is enabled

I do not want to change the main function just the other stuff

This code drove me crazy for a whole afternoon so a little help would be really appreciated. Thankyou

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

typedef struct
{
    int numerator;
    int denominator;
    void (*print)(); // prints on screen "numerator/denominator"
    float (*convertToNum)(); //returns value of numerator/denominator
    void (*setNumerator)(int n);
    void (*setDenominator)(int d);
} Fraction;

Fraction* allocFraction(Fraction* fraction); //creates an uninitialized fraction
void deleteFraction(Fraction *fraction); 


Fraction* allocFraction(Fraction* fraction)
{
    void print()
    {
        int a= 10;
         printf("%i/%i", (*fraction).numerator, (*fraction).denominator);
         a--;
    }

    float convertToNum()
    {
        return (float)(*fraction).numerator/(float)(*fraction).denominator;

    }

    void setNumerator (int n)
    {
        (*fraction).numerator= n;
    }

    void setDenominator (int d)
    {
        (*fraction).denominator= d;
    }

    if(fraction== NULL)
        fraction= (Fraction*) malloc(sizeof(Fraction));



    if(fraction)
    {
        (*fraction).convertToNum= convertToNum;
        (*fraction).print= print;
        (*fraction).setNumerator= setNumerator;
        (*fraction).setDenominator= setDenominator;
    }

    return fraction;
}


void deleteFraction(Fraction *fraction)
{
    free(fraction);
}


int main (int argc, const char * argv[]) 
{
    Fraction *fraction= allocFraction(fraction);
    (*fraction).setNumerator(4);
    (*fraction).setDenominator(7);
    (*fraction).print(); //EXC_BAD_ACCESS on debug. Illegal instruction in Terminal
    printf("%f", (*fraction).convertToNum());
    (*fraction).print();

    deleteFraction(fraction);
    return 0;
}

Upvotes: 3

Views: 128

Answers (1)

Greg Hewgill
Greg Hewgill

Reputation: 992965

You can't write C in the same way you write Javascript.

Specifically, it appears that print() is a nested function inside allocFraction() (which is itself not standard C but a gcc extension). You can't call a nested function through a function pointer from outside the scope of where it's defined. This is true even if you don't access anything in the outer scope from the nested scope.

Your code appears to be attempting to do object-oriented programming in C. Have you considered C++?

Upvotes: 3

Related Questions