1

1 つの MEX ファイルで、次のコマンドを使用して出力行列を作成しました (正常に動作しています)。

plhs[0] = mxCreateNumericMatrix((mwSize)destLen, 1, mxUINT8_CLASS, mxREAL);

高速化のために、初期化されていない動的メモリを使用したかったため、文書化されていないコマンドにたどり着きました。

plhs[0] = mxCreateUninitNumericMatrix((mwSize)destLen, 1, mxUINT8_CLASS, mxREAL);

Win32 および Win64 でも問題なく動作します。

Linux 環境でまったく同じコードを使用すると、コンパイラから次の警告が表示されます。

warning: assignment makes pointer from integer without a cast [enabled by default]

コードがクラッシュします。これは、返された整数値が正しいメモリ アドレスを指している値ではないことを示しています。

を使用するにはどうすればよいmxCreateUninitNumericMatrixですか?

4

2 に答える 2

2

ドキュメント化されていない MEX 関数には、mex.hヘッダー ファイルに対応するプロトタイプがないため、自分で明示的に記述する必要があります。この場合、次のようになります。

EXTERN_C mxArray *mxCreateUninitNumericMatrix(mwSize m, mwSize n, 
    mxClassID classid, mxComplexity flag);

EXTERN_Cマクロは、C++ を使用している場合は に展開され、extern "C"それ以外の場合は C に展開され、正しいリンケージexternが得られます。

C (C++ ではない) では、宣言されていない関数は、整数を返す外部関数であると見なされます (少なくとも、GCC コンパイラの場合はそうだと思います)。

于 2013-12-11T13:36:30.643 に答える
0

MathWorks はR2015amxCreateUninitNumericMatrixで両方を聞いて作成し、文書化したようです。これらは、matrix.h で次のように宣言されています。mxCreateUninitNumericArray

/*
 * Create an uninitialized numeric matrix.
 * The resulting array must be freed with mxDestroyArray.
 */
LIBMMWMATRIX_PUBLISHED_API_EXTERN_C mxArray *mxCreateUninitNumericMatrix(size_t m, 
    size_t n, mxClassID classid, mxComplexity flag);

/*
 * Create an uninitialized numeric array.
 * The resulting array must be freed with mxDestroyArray.
 */
LIBMMWMATRIX_PUBLISHED_API_EXTERN_C mxArray *mxCreateUninitNumericArray (size_t ndim, 
   size_t *dims, mxClassID classid, mxComplexity flag);

インクルード ソースが C か C++ かに応じて、マクロはor (MEX ファイルの場合) とLIBMMWMATRIX_PUBLISHED_API_EXTERN_C評価されます。externextern C

州の公式ドキュメント:mxCreateUninitNumericMatrix

を呼び出しmxCreateUninitNumericMatrixて、すべてのデータ要素が で指定された数値データ型を持つ 2 次元 mxArray を作成しますclassid。データ要素は初期化されません。

mxCreateUninitNumericMatrix作成された を格納するために動的メモリを割り当てますmxArray。呼び出しmxDestroyArrayてメモリの割り当てを解除します。

のドキュメントmxCreateUninitNumericArrayも同様です。

于 2014-12-11T00:05:02.083 に答える