2

構造体で関数ポインタをどのように使用しますか? 具体的には、次の例では、プログラムはコンパイルされますが、実行時にクラッシュします。

ヘッダファイル内

 #ifndef __FUNCTION_IN_STRUCT_H_
 #define __FUNCTION_IN_STRUCT_H_


struct functionDaemon {
     int id;
     //double (*funcp); // function pointer
     double  (*fp)(double);      // Function pointer
 };

 // #define NULL 'V'

 #endif /* _FUNCTION_IN_STRUCT_H_ */

C ファイルでは:

#include <math.h>
#include <stdio.h>

#include "function_in_struct.h"

extern struct functionDaemon *ftnAgent;

void do_compute_sum (void) {

     void* agent;
    // struct functionDaemon *ftnAgent = (struct functionDaemon *) agent;
    struct functionDaemon *ftnAgent;

    double  sum;

    // Use 'sin()' as the pointed-to function
    ftnAgent->fp = sin;
    sum = compute_sum(ftnAgent->fp, 0.0, 1.0);
    printf("sum(sin): %f\n", sum);

}

教えてください。

4

1 に答える 1

10

あなたはもうすぐそこにいます:

struct functionDaemon *ftnAgent;

double  sum;

// Use 'sin()' as the pointed-to function
ftnAgent->fp = sin;

あなたftnAgentは単なる初期化されていないポインタです。

struct functionDaemon ftnAgent;

double  sum;

// Use 'sin()' as the pointed-to function
ftnAgent.fp = sin;
sum = compute_sum(ftnAgent.fp, 0.0, 1.0);

これが実際の例です:

#include <math.h>
#include <stdio.h>


struct functionDaemon {
     int id;
     //double (*funcp); // function pointer
     double  (*fp)(double);      // Function pointer
 };


int main()
{
        struct functionDaemon f;
        f.fp = sin;

        printf("%f\n", (f.fp)(10));

        return 0;
}

編集

あなたがこれを持っているように:

extern struct functionDaemon *ftnAgent;

ftnAgent別の場所でインスタンス化されていると思います。この場合、すでに宣言されている構造体を非表示にするため、struct functionDaemon *ftnAgent;内側は必要ありません。そのため、間違った (初期化されていない) 変数にアクセスすることになります。do_compute_sumftnAgent

于 2013-09-06T17:43:25.933 に答える