0

重複の可能性:
Cの関数ポインターはどのように機能しますか?

スタックオーバーフローでのサーフィン私はこの例を見つけました:

/* Validation functions start */
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
    for (size_t i=0; i<arraySize; i++)
        array[i] = getNextValue();
}

int getNextRandomValue(void)
{
    return rand();
}

int main(void)
{
    int myarray[10];
    populate_array(myarray, 10, getNextRandomValue);
    ...
}

getNextRandomValueにパラメーターgetNextRandomValue(int i)があると想像してみてください。これをどのように含めて、関数が入力を受け入れるようにするのでしょうか。

どうもありがとう

4

3 に答える 3

3

一般的な方法は、関数と一緒に「データ」へのポインタを渡すことです。関数が呼び出されたら、その「データ」ポインターを関数に渡し、関数自体がそのデータをどう処理するかを知っていると想定します。実際、データは通常、構造体へのポインターです。したがって、コードは次のようになります。

struct func1_data {
    int a;
    int b;
};

struct func2_data {
    char x[10];
};

int function1(void *data) {
    struct func1_data *my_data = (typeof(my_data)) data;
    /* do something with my_data->a and my_data->b */
    return result;
}

int function2(void *data) {
    struct func2_data *my_data = (typeof(my_data)) data;
    /* do something with my_data->x */
    return result;
}

そして私たちが持っていると仮定します

int caller(int (*callback), void *data) {
    return callback(data);
}

次に、これをすべて次のように呼び出します。

struct func1_data data1 = { 5, 7 };
struct func2_data data2 = { "hello!" };
caller(function1, (void *) &data1);
caller(function2, (void *) &data2);
于 2013-01-11T06:22:55.377 に答える
1

関数ポインタの構文に精通することはおそらく良い考えです。引数をに変更する必要がありますint (*getNextValue)(int)

于 2013-01-11T02:45:58.833 に答える
1

次に、コードは次のようになります...

void populate_array(int *array, size_t arraySize, int (*getNextValue)(unsigned int))
{
    unsigned int seedvalue = 100;

    for (size_t i=0; i<arraySize; i++)
        array[i] = getNextValue(seedvalue);
}

int getNextRandomValue(unsigned int seed)
{
    srand(seed);
    return rand();
}

int main(void)
{
    int myarray[10];
    populate_array(myarray, 10, getNextRandomValue);
    ...
}
于 2013-01-11T05:59:09.230 に答える