第i个元素返回i的函数数组

时间:2018-09-09 13:01:07

标签: c++ function-pointers

昨天我的朋友挑战我用C语言编写一个函数,该函数将返回一个函数指针数组,第i个函数将返回i。 在C ++中很容易获得类似的效果,但是我不确定如何在C中做到这一点。

有人可以帮我吗?

编辑。

我正在寻找的效果与此等效。

vector <function<int()>> get_functions(int n) {
    vector <function<int()>> functions;
    for (int i = 0; i < n; ++i) {
        functions.emplace_back([i]() {
            return i;
        });
    }
    return functions;
}


int main() {
    auto functions = get_functions(10);
    for (auto f:functions) {
        cout << f() << endl;
    }
    return 0;
}

编辑。

根据评论部分的要求,我对挑战提出了较差的尝试。

typedef int (*fun_t)(void);

int fun() { return 0; }
int fun1() { return 1; }

fun_t *get_functions() {
    fun_t *functions = malloc(sizeof(fun_t) * 2);

    functions[0] = fun;
    functions[1] = fun1;

    return functions;
}

int main() {
    fun_t* funs=get_functions();
    for (int i = 0; i < 2; ++i) {
        printf("%d\n",funs[i]());
    }
    free(funs);
}

1 个答案:

答案 0 :(得分:1)

C ++代码在作弊。 function<int()>不是函数指针;实际上,它根本不是指针,而是一个类。

因此等效的C代码看起来像这样:

#include <stdio.h>
#include <stdlib.h>

// function<int ()>, simplified version just for this task
typedef struct {
    int (*code)(int);
    int ctx;
} function_int_t;

// function<int()>::operator()()    
int call(function_int_t fun) {
    return fun.code(fun.ctx);
}

// lambda body
int proto(int ctx) {
    return ctx;
}

function_int_t *get_functions(size_t n) {
    function_int_t *functions = calloc(n, sizeof *functions);
    if (!functions) {
        abort();  // hey, that's how C++ does it
    }
    for (size_t i = 0; i < n; i++) {
        functions[i] = (function_int_t){ proto, i };  // capture i
    }
    return functions;
}

int main(void) {
    size_t n = 10;
    function_int_t *functions = get_functions(n);
    for (size_t i = 0; i < n; i++) {
        printf("%d\n", call(functions[i]));
    }
    free(functions);
    return 0;
}