0

整数を取り、void * を返す関数ポインターの typedef を作成しました。

typedef void* (*fp)(int index);

次に、fp と同じ型の別の構造体を含む構造体を作成しました。

typedef struct fp_holder {
    fp function_pointer;
    iterable *next;
} fp_holder;

fp_holder 内で fp を呼び出す方法を見つけようとしています。

これをテストするために、次のことを行いました。

void *test_fp(int index) {
    if (index == 0) {
        printf('H');
        fflush(stdout);
        return [something_that_works];
    }
    else if (index == 1) {
        printf('e');
        fflush(stdout);
        return [something_that_works];
    }
    else if (index == 2) {
        printf('l');
        fflush(stdout);
        return [something_that_works];
    }
    else if (index == 3) {
        printf('l');
        fflush(stdout);
        return [something_that_works];
    }
    else if (index == 4) {
        printf('o');
        fflush(stdout);
        return [something_that_works];
    }
    else {
        return (void *) NULL;
    }
}

fp_holder *a = (fp_holder *) malloc(sizeof(fp_holder));
a->function_pointer = test_fp;
a->next = NULL;

そのため、すべてのセットアップで、次のことを試して a の function_pointer を呼び出そうとしました。

a->function_pointer(0);
(*a->function_pointer)(0);
((*)a->function_pointer)(0);

なぜそれらが機能しないのかわかりません。助けていただければ幸いです!:)

編集

私がやろうとしていること:引数を指定して a の function_pointer を呼び出します。

私は今いくつかの答えを試してみて、何が起こるか見ていきます。

EDIT2

答えた!a->function_pointer(0) を実行して正しく呼び出していましたが、セグメンテーションエラーが発生していたのは [これが私の問題であり、これを明確にする必要があったかもしれません] は printf ステートメントであり、私の呼び出しではありませんでした。printf には、入力した char ではなく文字列が必要です。

4

2 に答える 2

5

元のコードは実際に機能しますか

printf('H');

それ以外の

printf("H");

?

printfへの正しい引数を使用して、投稿したコードの簡略版:

#include <stdio.h>

typedef void* (*function_pointer_t)(int index);

struct function_holder {
    function_pointer_t callback;
};

void* testFn(int i)
{
    printf("testFn %d\n", i);
}

int main(void) {
    struct function_holder fh = { testFn };
    struct function_holder* fhp = &fh;

    fh.callback = testFn;
    fh.callback(1);
    fhp->callback(2);

    return 0;
}

期待どおりに動作します: http://ideone.com/1syLlG

于 2013-11-03T08:19:47.127 に答える
0

あなたのコードにはいくつかのエラーがあります。このコードで何を達成しようとしているのかはわかりませんが、これが作業コードです。

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

typedef void* (*fp)(int index);
typedef struct fp_holder {
    fp function_pointer;
    struct fp_holder *next;
} fp_holder;

void *test_fp(int index) {
    if (index == 0) {
        printf("H");
        fflush(stdout);
        return "H";
    }
    else if (index == 1) {
        printf("e");
        fflush(stdout);
        return "e";
    }
    else if (index == 2) {
        printf("l");
        fflush(stdout);
        return "l";
    }
    else if (index == 3) {
        printf("l");
        fflush(stdout);
        return "l";
    }
    else if (index == 4) {
        printf("o");
        fflush(stdout);
        return "o";
    }
    else {
        return (void *) NULL;                                                                                                                                    }
    }


int main() {
    fp_holder *a = (fp_holder *) malloc(sizeof(fp_holder));
    a->function_pointer = test_fp;
    a->next = NULL;
    a->function_pointer(0);
}
于 2013-11-03T08:33:07.563 に答える