10

私は現在、32ビットMatlab用のいくつかのCMEXファイルを64ビットMatlabに移植する作業を行っています。

そうしている間に、私は2つのタイプに遭遇しました。1つはMatlabの人々からのもので、もう1つはC標準です。

これは、Matlabのドキュメントが言っていることmwSizeです:

mwSize(CおよびFortran)

サイズ値の入力

説明

mwSize配列の次元などのサイズ値を表すタイプです。クロスプラットフォームの柔軟性のためにこの関数を使用してください。デフォルトでmwSizeは、はCと同等です。スイッチintを使用する場合は、Cと同等です。Fortranでは、プラットフォームとコンパイルフラグに基づいて、またはと同等になります。mex -largeArrayDimsmwSizesize_tmwSizeINTEGER*4INTEGER*8

これはウィキペディアが言っていることですsize_t

size_tは、。[1]で定義されているいくつかのC / C ++標準(C99 ISO / IEC 9899標準など)で定義されている符号なしデータ型です。このファイルの内部には[2]が含まれているためstddef.h、含めることでさらにインポートできます。stdlib.hstddef.h

このタイプは、オブジェクトのサイズを表すために使用されます。サイズを取得または返すライブラリ関数は、サイズがこのタイプであるか、戻りタイプが。であることを想定していますsize_t。さらに、最も頻繁に使用されるコンパイラベースの演算子sizeofは、と互換性のある値に評価する必要がありますsize_t

実際のタイプsize_tはプラットフォームに依存します。size_tよくある間違いは、と同じであると想定することですunsigned int。これは、たとえば32ビットアーキテクチャから64ビットアーキテクチャに移行するときに、プログラミングエラー[3][4]につながる可能性があります。

私が見る限り、これらのタイプは実際には同じです。私の質問は次のとおりです。

  1. 彼らは?
  2. もしそうなら、どちらを使用するのがより良いプログラミングの好みと見なされますか?理想的には、コードが将来のMatlabリリースとも互換性があることを望んでいます。答えはmwSizeだと思いますが、よくわかりません。

編集:Matlabの人々が両方を使用していることを追加する必要があります。例えば:

size_t mxGetN(const mxArray *pm);

mxArrayの列数を取得する関数です。ただし、行列を作成するときは、

mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag);

ここで、入力は明らかにmwSizeである必要があります。

4

1 に答える 1

12

mwSize下位互換性と移植性のために定義されています。ドキュメントに記載されているように、コンパイル中にスイッチが使用されていない場合と使用されているint場合にマップされます。したがって、最初のケースでは署名されていますが、2番目のケースでは署名されていません。-largeArrayDimssize_tmwSize

コードで使用mwSizeすると、そのフラグが使用されているかどうかに関係なく、すべてのプラットフォームでコードを再利用できます。

ご指摘のAPIの不整合については、真に不整合ですが、大きな懸念事項ではありません。mxGetN()負の数を返すことは決してないので、aを返すことsize_tは問題ありません。ただし、(推測している)古いバージョンまたは特定のプラットフォーム上のmex APIのバージョンでは、intが渡されることを想定してmxCreateDoubleMatrix()いるため、関数を型の入力を受け取るように定義するmwSizeと、移植性や下位互換性が確保されます。

簡単な答えは、mex関数をコンパイルするために使用mwSizeして使用することです。-largeArrayDims

于 2011-07-05T17:00:13.363 に答える