Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 仅在c中使用结构中的函数_Function_Pointers_Struct - Fatal编程技术网

Function 仅在c中使用结构中的函数

Function 仅在c中使用结构中的函数,function,pointers,struct,Function,Pointers,Struct,我很难编译这段C代码 基本上发生的是: 它确实编译,但当我(在终端上)运行它时,它会打印我:非法指令 我试着在Xcode上调试它,当它试图执行(*fraction).print()时,它说:EXC\u BAD\u ACCESS 如果我删除(*分数).print()行,一切正常(如果我只删除下一行,情况也一样) GNU99和-fnested functions标志已启用 我不想改变主要功能,只是其他的东西 这个代码让我疯狂了整整一个下午,所以我非常感谢你的帮助。 谢谢 #包括 #包括“stri

我很难编译这段C代码

基本上发生的是:

  • 它确实编译,但当我(在终端上)运行它时,它会打印我:非法指令
  • 我试着在Xcode上调试它,当它试图执行(*fraction).print()时,它说:
    EXC\u BAD\u ACCESS
  • 如果我删除(*分数).print()行,一切正常(如果我只删除下一行,情况也一样)
GNU99和-fnested functions标志已启用

我不想改变主要功能,只是其他的东西

这个代码让我疯狂了整整一个下午,所以我非常感谢你的帮助。 谢谢

#包括
#包括“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;
}