Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Functions in struct in c only

I am having a hard time compiling this C code.

Basically what happens is:

  • it does compile but when I run it (on Terminal) it prints me:Illegal instruction
  • I tried to debug it and on Xcode and when it attempts to execute (*fraction).print() it says: EXC_BAD_ACCESS
  • if I delete the (*fraction).print() line everything works fine (same happens if I only delete the next line)

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;
}
like image 934
user1118686 Avatar asked Feb 15 '26 01:02

user1118686


1 Answers

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++?

like image 152
Greg Hewgill Avatar answered Feb 17 '26 19:02

Greg Hewgill



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!