0

Fortran と C++ を組み合わせる必要があります。C++ クラスを作成しました。C++ ライブラリを呼び出す extern "C" 関数のおかげで、C++ パブリック関数を呼び出すことができます。

この関数は、この C++ クラスのいくつかのインスタンスを作成します。この関数が終了したら、それらのインスタンスをメモリに保持して後で呼び出す必要があります。しかし、破壊私のインスタンスは自動的に呼び出されます。

これらのインスタンスを Fortran では使用したくありませんが、ラップされた他の C++ 関数で使用したいと考えています。iso_c_binding や Fortran 2003 関数は (残念ながら) 使用できません。

インスタンスをメモリに保持するための簡単なアイデアはありますか?

前もって感謝します。

4

1 に答える 1

1

次回同じ関数に入ったときに同じ C++ オブジェクトに再度アクセスしたい場合は、それらをstatic関数内で宣言することができます。これにより、関数の各呼び出しが同じ (静的) 変数のセットを共有するようになります。

複数の関数が同じオブジェクトにアクセスする必要がある場合は、名前空間スコープ (関数またはクラスの外側) でそれらを定義できます。オブジェクトにアクセスする関数の呼び出しはすべて、同じグローバル変数を共有します。

インスタンスをグローバルまたはにすることによって暗示されるインスタンスの暗黙的な共有を望まない場合static、最良のオプション (とにかく最良のオプション) は、インスタンスを動的に割り当てる create/destroy 関数を備えたクラスの周りに C ラッパーを記述することです。クラス。例えば:

// x.hpp
class X {
public:
    X(int);
    void foo();
};

// x_wrapper.h
extern "C" {
void* create_x(int arg);
void destroy_x(void* anX);
void x_foo(void* anX);
}

// x_wrapper.cpp
#include "x.hpp"
#include "x_wrapper.h"

void* create_x(int arg) {
    return new X(arg);
}

void destroy_x(void* anX) {
    X* self = (X*)anX;
    delete self;
}

void x_foo(void* anX) {
    X* self = (X*)anX;
    return self->foo();
}
于 2012-12-10T17:19:57.250 に答える