我很难编译这段 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/