Функции в структуре только в c - PullRequest
3 голосов
/ 28 декабря 2011

Я с трудом компилирую этот код C.

В основном происходит следующее:

  • он компилируется, но когда я запускаю его (на терминале), он печатает меня:Недопустимая инструкция
  • Я пытался отладить его и в Xcode, и когда он пытается выполнить (* дробь) .print (), он говорит: EXC_BAD_ACCESS
  • , если я удаляю (* дробь).print () все работает нормально (то же самое происходит, если я удаляю только следующую строку)

GNU99 и флаг -fnested-functions включен

Я не хочу менятьосновная функция, просто другие вещи

Этот код сводил меня с ума на целый день, так что небольшая помощь была бы очень признательна.Спасибо

#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 Ответ

3 голосов
/ 28 декабря 2011

Вы не можете писать C так же, как пишете Javascript.

В частности, похоже, что print() - это вложенная функция внутри allocFraction() (которая сама по себе не стандартная C, а расширение gcc). Вы не можете вызывать вложенную функцию через указатель на функцию из-за пределов области, в которой она определена. Это верно, даже если вы не получаете доступ к внешней области из вложенной области.

Ваш код, кажется, пытается выполнить объектно-ориентированное программирование на C. Вы рассматривали C ++?

...