2

私は数学ライブラリを書いています。そのコアは C++ にあります。後で、純粋な C (C99 だと思います) で実装される可能性があります。Python や matlab などでライブラリを使用できるようにするには、C のような API が必要だと思います。私の印象では、これを C++ で行うのは面倒です。

double complex *some_array_in_C99と の間でキャストするための適切な、標準的な、または適切な方法はありcomplex<double> *some_array_in_cppますか?

ポインターを使用することもできvoid *ますが、それが良いかどうかはわかりません。

ctypes は で問題なく動作するように見えるため、これはつまらないことかもしれませんが、complex<double>matlab やその他の数値環境が心配です。

4

1 に答える 1

2

C99 および C++0x 標準は両方とも、それぞれの倍精度複素数型が 2 つの倍精度浮動小数点数の配列と同じ位置合わせとレイアウトを持つ必要があることを指定しています。これは、引数を として渡すことを回避しvoid *、ルーチンをどちらの言語からも (比較的) 簡単に呼び出すことができることを意味します。これは、多くのライブラリが採用しているアプローチです。

reinterpret_castC++0x 標準では、std::complex<double>*todouble*が正しいことを行うことが保証されています (§26.4) 。私の記憶が正しければ、これは標準の以前のバージョンではそれほど明確に指定されていませんでした。C++0x をターゲットにする意思がある場合は、これを使用してインターフェイスをよりクリーンにすることができる場合があります。

実際のレイアウトとアラインメントの仕様が一致するように定義されていることを考えると、言語のヘッダー ファイルで型を条件付けしたくなるでしょう。実装ではどちらの言語も使用でき、データはどちらの方法でもメモリ内に適切に配置されます。ただし、MATLAB が内部でどのように動作するかはわかりません。そのため、これが MATLAB と互換性があるかどうかはわかりません。彼らが標準の LAPACK アプローチを使用する場合、すべての状況ですべてのプラットフォームではなく多くのプラットフォームで使用されます。LAPACK は、独自のdouble complex型をstruct2 つのdoubleメンバーを持つ a として定義します。これは通常、メモリ内で同じように配置されますが (これは保証されません)、一部のプラットフォームでは異なる呼び出し規則に従う場合があります。

于 2010-07-26T12:29:09.747 に答える