3

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;
}
1
  • Btw, you can use fraction->XXX instead of (*fraction).XXX. Commented Dec 28, 2011 at 5:32

1 Answer 1

3

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

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

2 Comments

Yes I considered oop. But I want to have functions in struct where the funcions do not have to accept the structure itself.
Your goal is not possible in C.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.