3

void *function(...)Fortranからを呼び出す方法は?

私は現在、FortranからいくつかのC関数を呼び出そうとしています。以前にそうしましたが、自分の関数だけを呼び出しました。たとえば、次のように呼び出します。

void add(int *csum, int *ca, int *cb) { *csum = *ca + *cb; }

Fortranから、私は以下を使用しました:

INTEGER :: fsum, fa, fb
CALL add(fsum, fa, fb)

これは正常に機能します。今、私は大まかに次のようないくつかの関数を持っています:

void *create_obj(void);
void use_obj(void *obj);
void free_obj(void *obj);

あるいは:

struct private_struct; /* defined somewhere else */
struct private_struct *create_p(void);
void use_p(struct private_struct *p);
void free_f(struct private_struct *p);

構造体がプライベートである場合、つまり、私はそのメンバーについての知識がありません。

質問: Fortranに戻り値を取得するにはどうすればよいですか?私は実際にそれらにアクセスする必要はありませんが、それらのライフサイクルの間に何らかの方法でそれらを保存する必要がcreateありuseますdestroy

4

2 に答える 2

5

Cでオブジェクトを作成し、そのオブジェクトへのポインターをFortranに渡してから、そのポインターをCルーチンに渡すことができます。最後に、Cルーチンを呼び出してメモリを解放します。ISO Cバインディングは、FortranタイプのC_PTRを提供します。

于 2012-06-13T20:02:25.657 に答える
1

オブジェクトへのポインタを返す代わりに、Cライブラリ内の配列(または他のコンテナ)にポインタを保持し、配列(またはコンテナに適合するもの)に戻ってインデックスを付けることができます。

int create_obj(); // returns the obj_id
void use_obj(int *obj_id);
void free_obj(int *obj_id);

配列のどの要素が使用されているかを数え続ける必要があります。何かのようなもの

struct Entry {
    bool used;
    struct Obj value; 
}
Entry objects[100];
于 2012-06-13T19:41:05.897 に答える