Function 仅在c中使用结构中的函数
我很难编译这段C代码 基本上发生的是:Function 仅在c中使用结构中的函数,function,pointers,struct,Function,Pointers,Struct,我很难编译这段C代码 基本上发生的是: 它确实编译,但当我(在终端上)运行它时,它会打印我:非法指令 我试着在Xcode上调试它,当它试图执行(*fraction).print()时,它说:EXC\u BAD\u ACCESS 如果我删除(*分数).print()行,一切正常(如果我只删除下一行,情况也一样) GNU99和-fnested functions标志已启用 我不想改变主要功能,只是其他的东西 这个代码让我疯狂了整整一个下午,所以我非常感谢你的帮助。 谢谢 #包括 #包括“stri
- 它确实编译,但当我(在终端上)运行它时,它会打印我:非法指令
- 我试着在Xcode上调试它,当它试图执行(*fraction).print()时,它说:
EXC\u BAD\u ACCESS
- 如果我删除(*分数).print()行,一切正常(如果我只删除下一行,情况也一样)
#包括
#包括“string.h”
#包括“stdio.h”
类型定义结构
{
整数分子;
整数分母;
void(*print)(;//在屏幕上打印“分子/分母”
float(*convertToNum)(;//返回分子/分母的值
无效(*集合分子)(整数n);
无效(*设置分母)(int d);
}分数;
分数*分配分数(分数*分数)//创建未初始化的分数
空隙率(分数*分数);
分数*分配分数(分数*分数)
{
作废打印()
{
INTA=10;
printf(“%i/%i”,(*分数)。分子,(*分数)。分母);
a——;
}
浮式转炉()
{
返回(浮动)(*分数)。分子/(浮动)(*分数)。分母;
}
无效集合分子(整数n)
{
(*分数)。分子=n;
}
无效集合分母(int d)
{
(*分数)。分母=d;
}
如果(分数==NULL)
分数=(分数*)malloc(sizeof(分数));
if(分数)
{
(*分数)。convertonum=convertonum;
(*分数)。打印=打印;
(*分数)。setNumerator=setNumerator;
(*分数)。集合分母=集合分母;
}
收益率;
}
空隙率(分数*分数)
{
游离(分数);
}
int main(int argc,const char*argv[]
{
分数*分数=分配分数(分数);
(*分数)。分子集合(4);
(*分数)。集合分母(7);
(*fraction).print();//调试时EXC_访问错误。终端中的指令非法
printf(“%f”,(*分数).convertToNum());
(*分数).print();
删除分数(分数);
返回0;
}
不能像编写Javascript那样编写C
具体来说,print()
似乎是allocFraction()
中的一个嵌套函数(它本身不是标准的C,而是一个gcc扩展)。不能从定义嵌套函数的范围之外通过函数指针调用嵌套函数。即使您没有从嵌套范围访问外部范围中的任何内容,这也是正确的
C.代码中的代码似乎是在尝试做面向对象编程,你是否考虑过C++?
BTW,可以使用<代码>分数> XXX < /C> >代替<代码>(*Fielt)。XXX < /Cord>。是的,我考虑了OOP。但是我想在struct中使用函数,函数不必接受结构本身。#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;
}