2012-03-23 2 views
1

C++メインプログラムからFortran 90コードを呼び出そうとしています。 Fortranのサブルーチンは、double型の配列(Xと呼ぶ)をパラメータとして受け取り、コードの多くの場所でsize(X)を使用します。私はFortran90とC++で作成された配列のサイズ

double *x = new double[21] 

によって作成されたCアレイとルーチンを呼び出すが、私はFortranコードでサイズ(X)の結果を印刷するとき、私は837511505、または他のいくつかの大きな数字を取得します。

現在、私はFortranコードを変更できます。最悪の場合は、サイズをパラメータとして渡して関数を書き直すことです。しかし、私はむしろそれをしないだろう。

Fortranルーチンがそのサイズを把握できるような方法でC配列を作成できる方法があれば誰にも分かりますか?

+0

おそらくFortranは、渡しているポインタに対してメモリのどこかに配列のサイズが格納されていると予想していますが、C++はそれを強く要求しません。 –

答えて

1

これは実装固有の機能です。多くの実装(例えば、RSXやOpenVMS)は、データへのポインタと次元、型などの記述を渡すための構造体を定義します。外部宣言が明示的にディスクリプタ。ほとんどの場合、そのようなメカニズムはありません。使用中のどの実装知らず

a)は、コンパイラのマニュアル
B)を読んでは、コンパイラはアセンブリを生成していて、それが

+0

返事をありがとう。おそらく、intelとgnuコンパイラを使用している可能性があります。プロジェクトのマイナーな部分についてのみです。私がFortranコードを使用すると、おそらくラッパーを書くだけです。 – Alain

0

インテルのF95は、配列記述子の構造を使用して期待するかを確認する検査します配列ポインタとは別に境界と次元情報も格納されます。 size()は、ディスクリプタから情報を取得します。

Cのポインタから渡すので、記述子情報は使用できません。したがって、size()はぎこちないことを返します。

通常、配列や構造体はプログラマーの痛みになることが多い混合言語プログラミングの難題です。インテルコンパイラのユーザー文書には、C < => F95混在呼び出しに関する別のセクションがあります。

特に、インターフェイスとバインディングについてチェックします。これは言語間の呼び出しに役立つ素晴らしいF95機能です。

慣習に従えば、C < => F95の呼び出しは非常にうまく動作します。

0

私は個人的に、C++からfortran 90/95/2003までの混合コーディングを使用します。私は通常、コンパイラとしてgfortranを使用しますが、この問題を避けるために、配列のサイズを常に送信するのが一般的です。これにより、形状を変更することさえできます。

double* x = new double[2*21] 

real(8),intent(in),dimension(2,21)::x 

これは非常に便利な機能であり、あなたはsizeコマンドを使用できるようになります:2次元配列含むのx、yの点を考慮してください。コンパイラの仕様に関する答えは正しいです。ほとんどのコンパイラでコードを使用できるようにするには、多言語インターフェイスを使用するときに長さを指定する必要があります。