仅在 c 中的结构中的函数

标签 function pointers struct

我很难编译这段 C 代码。

基本上发生的是:

  • 它确实可以编译,但是当我运行它时(在终端上)它会打印出 me:Illegal instruction
  • 我尝试在 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;
}

最佳答案

您不能像编写 Javascript 一样编写 C。

具体来说,print() 似乎是 allocFraction() 中的一个嵌套函数(它本身不是标准 C,而是一个 gcc延期)。您不能从定义范围之外的函数指针调用嵌套函数。即使您不从嵌套范围访问外部范围内的任何内容,也是如此。

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

关于仅在 c 中的结构中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8652209/

相关文章:

c - 使用和取消引用 (void**)

c - 函数执行后结构保持不变

python - 为什么我无法打印返回值?

使用 void 指针连接两个数组 (C)

python - python中def有多个参数

mysql - 在表中使用数学函数创建新列

pointers - 我可以使用指针在 Fortran 中创建子数组吗?

C++ 指针之间的取消引用

ios - 如何公开我的 Struct 变量?

c - 指向结构的指针不递增