仅在c中的struct中的函数

时间:2011-12-28 05:28:02

标签: function pointers struct

我很难编译这个C代码。

基本上会发生什么:

  • 它确实编译但是当我运行它(在终端上)它打印我:非法指令
  • 我尝试调试它并在Xcode上尝试执行(* fraction).print()时说:EXC_BAD_ACCESS
  • 如果我删除(* fraction).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 个答案:

答案 0 :(得分:3)

你不能像编写Javascript那样编写C语言。

具体来说,print()似乎是allocFraction()内的嵌套函数(它本身不是标准C而是gcc扩展名)。您不能通过函数指针调用嵌套函数,该函数指针位于定义范围之外。即使您没有从嵌套范围访问外部作用域中的任何内容,也是如此。

你的代码似乎是在C中尝试进行面向对象的编程。你考虑过C ++吗?