接收函数指针并将它们存储在标准C

zpqajqem  于 2023-03-12  发布在  其他
关注(0)|答案(1)|浏览(86)

我希望有一个名为“get_example_by_id”的函数,它接受一个int l和“返回”int a, b,以及两个函数指针fJ

int a, b;
double (*f) (double), (*J) (double, double);
get_example_by_id(l, &a, &b, &f, &J);

稍后,我需要fJ是可调用的,因为我需要它们来进行计算。

double f1(double t);
double F1(double t, double alpha);

void get_example_by_id(int l, int *a, int *b, double (*f) (double), double (*F) (double, double)) {
    
    switch(l) {
        case 1:
            *a = 0; *b = 5; f = f1; F = F1;
        default:
            break;
    }
}

double f1(double t) {
    return t;
}

double F1(double t, double alpha) {
    return 1/tgamma(alpha + 2) * powl(t, alpha + 2);
}

(get_example_by_id在上面未显示的部分中定义)f(1)为NULL,因此不可调用。此外,我得到这个错误“未定义的符号_f和_F”,因为我不知道如何解决的实验。任何帮助,甚至关于如何编码的新想法,不胜感激。
还有更多的功能要来,这应该成为某种数据库
编辑:工作示例将是get_example_by_id()调用后的printf("%f", f(1)),以便我可以确保函数调用实际上是正确执行的。
EDIT2:修复了实际函数指针声明。执行f = NULL时,问题现在是(与以前一样)Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)

n9vozmp4

n9vozmp41#

它不是函数指针。要声明函数指针,需要使用不同的语法。

double (*f)(double), (*J)(double, double);

要修改指针,您需要将引用传递给它:

double f1(double t);
double F1(double t, double alpha);

void get_example_by_id(int l, int *a, int *b, double (**f) (double), double (**F) (double, double)) {
    
    switch(l) {
        case 1:
            *a = 0; *b = 5; *f = f1; *F = F1;
        default:
            break;
    }
}

double f1(double t) {
    printf("It is f1\n");
    return 1.1;
}

double F1(double t, double alpha) {
    printf("It is F1\n");
    return 0.0;
}

int main(void)
{
    double (*f)(double), (*J)(double, double);
    get_example_by_id(1, &(int){0}, &(int){0}, &f, &J);
    f(0.);
    J(0.,0.);
}

https://godbolt.org/z/oTndWeze9

相关问题