最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

64 ビット API を使用するように Fortran MEX ファイルをアップグレード

64 ビット API を使用するように MEX ファイルをアップグレードの手順は、Fortran および C/C++ ソース ファイルに適用されます。Fortran は同じく mwSize または mwIndex 型の類似の API シグネチャ、および類似のコンパイラとデバッガーを使用します。

ただし、Fortran ソース コードを 64 ビット互換にするには、以下の追加作業を行います。

Fortran API ヘッダー ファイルの使用

Fortran MEX ファイルを 64 ビット API 互換にするには、Fortran ソース ファイルで fintrf.h ヘッダー ファイルを使用します。ソース ファイルに大文字の .F ファイル拡張子を付けて名前を付けます。これらの要件についての詳細は、Fortran MEX ファイルのコンポーネントを参照してください。

Fortran ポインターの宣言

ポインターはマシンのタイプに応じて、32 ビットまたは 64 ビットのアドレスになります。この要件は配列次元に直結するものではありませんが、この変換の一部として 32 ビット コードを 64 ビット マシンに移行する際に問題が発生する可能性があります。

詳細については、プリプロセッサ マクロおよび mwPointer を参照してください。

C/C++ コンパイラはポインター サイズを自動的に処理します。Fortran の場合、MATLAB®mwPointer 型を使用してこの差異を処理します。たとえば、mxCreateDoubleMatrixmwPointer を返します。

mwPointer mxCreateDoubleMatrix(m, n, ComplexFlag)
mwSize m, n
integer*4 ComplexFlag

要件としての Fortran 型宣言

Fortran では暗黙的な型宣言を使用します。I から N までの文字で始まる宣言されていない変数は、暗黙的に宣言された INTEGER 型です。その他の文字で始まる変数名は、暗黙的に宣言された REAL*4 型です。暗黙的な INTEGER 型の使用は 32 ビット インデックスでは動作しますが、大規模配列次元の MEX ファイルでは安全ではありません。すべての変数を宣言するようにするには、Fortran サブルーチンに IMPLICIT NONE ステートメントを追加します。以下に例を示します。

subroutine mexFunction(nlhs, plhs, nrhs, prhs)
implicit none

このステートメントは、明示的な型宣言をしていないコードで 32 ビット整数を識別するのに役立ちます。次に、必要に応じて、これらの整数を INTEGER*4 または mwSize / mwIndex として宣言できます。IMPLICIT NONE に関する詳細は、Fortran コンパイラのドキュメンテーションを参照してください。

関数呼び出しによる変数の使用

関数への引数に数値を使用する場合、Fortran コンパイラはその引数に間違った型を割り当てる可能性があります。64 ビット プラットフォームでは、間違った型により Out of Memory エラー、セグメンテーション違反または間違った結果が発生します。たとえば、関数 mxCreateDoubleMatrix に対する引数の型の定義は、以下のようになります。

mwPointer mxCreateDoubleMatrix(m, n, ComplexFlag)
mwSize m, n
integer*4 ComplexFlag

次のステートメントを含む C/C++ MEX ファイルがあるとします。

myArray = mxCreateDoubleMatrix(2, 3, mxREAL); 

ほとんどの C/C++ コンパイラは数字 2 を 64 ビット値と解釈します。Fortran のコンパイラのなかには、この要件を検出できず、32 ビット値を使用するものがあります。たとえば、対応する Fortran ステートメントは以下のようになります。

myArray = mxCreateDoubleMatrix(2, 3, 0)

コンパイラは引数 ComplexFlag の値 0 を正しく INTEGER*4 型と解釈します。しかし、引数 mmwSize 型と宣言されていても、このコンパイラは引数 2 を 32 ビット値と解釈する可能性があります。

この問題に対するコンパイラに依存しないソリューションは、リテラル値の代わりに、変数 mwSize / mwIndex を宣言して使用することです。たとえば、次のステートメントなら Fortran で関数 mxCreateDoubleMatrix を曖昧さを残さずに呼び出します。

mwSize nrows, ncols
INTEGER*4 flag
nrows = 2
ncols = 3
flag = 0
myArray = mxCreateDoubleMatrix(nrows, ncols, flag)

Fortran コンパイラ警告外の事象の管理

Fortran コンパイラのなかには、C/C++ コンパイラのようには型の不一致を検出できないものがあります。この能力不足のため手順-largeArrayDims のビルド エラーと警告の解決が複雑になり、より多くの問題を手順64 ビット MEX ファイルの実行結果を 32 ビット バージョンと比較のデバッガーに残す結果になります。

参考

| |

関連する例

詳細

外部の Web サイト