デフォルトでは、インテル® Fortran は、文字列に長さの隠し引数を渡します。長さの隠し引数は、符号なしの 4 バイト整数 (IA-32 アーキテクチャー・ベースのシステム) または 8 バイト整数 (インテル® 64 および IA-64 アーキテクチャー・ベースのシステム) で構成されます。常に、値により渡され、引数リストの最後に追加されます。文字列の渡し方のデフォルトは、属性を使用すると変更できます。次の表は、渡される文字列に対するさまざまな属性の効果をまとめたものです。
引数 |
デフォルト |
C |
C、REFERENCE |
STDCALL (Windows*) |
STDCALL、REFERENCE (Windows) |
---|---|---|---|---|---|
文字列 |
長さとともに参照により渡される |
最初の文字が INTEGER(4) に変換され、値により渡される |
長さとともに参照により渡される |
最初の文字が INTEGER(4) に変換され、値により渡される |
長さとともに参照により渡される |
VALUE オプションを持つ文字列 |
エラー |
最初の文字が INTEGER(4) に変換され、値により渡される |
最初の文字が INTEGER(4) に変換され、値により渡される |
最初の文字が INTEGER(4) に変換され、値により渡される |
最初の文字が INTEGER(4) に変換され、値により渡される |
REFERENCE オプションを持つ文字列 |
大抵、長さとともに参照により渡される |
参照により渡される。長さは渡されない |
参照により渡される。長さは渡されない |
参照により渡される。長さは渡されない |
参照により渡される。長さは渡されない |
上記の表で重要な点を以下のとおりです。
C ルーチンまたは STDCALL ルーチンに渡される VALUE または REFERENCE の属性は、参照では渡されません。代わりに、最初の文字のみが値によって渡されます。
C ルーチンまたは STDCALL ルーチンに渡される VALUE オプションを持つ文字列は、参照では渡されません。代わりに、最初の文字の値のみが渡されます。
デフォルトの ATTRIBUTES、ATTRIBUTES C、REFERENCE、または ATTRIBUTES STDCALL、REFERENCE を持つ文字列引数の場合:
-nomixed-str-len-arg (Linux* および Mac OS* X) または /iface:nomixed_str_len_arg (Windows) が設定されると、ほかのすべての引数の後に、文字長 (の値) がスタックにプッシュされます。これはデフォルトです。
-mixed-str-len-arg (Linux および Mac OS X) または /iface:mixed_str_len_arg (Windows) が設定されると、文字列の先頭アドレスの直後に、文字長 (の値) がスタックにプッシュされます。
デフォルトの ATTRIBUTES とともに参照により渡される文字列引数の場合:
-nomixed-str-len-arg (Linux および Mac OS X) または /iface:nomixed_str_len_arg が設定されると、呼び出されたプロシージャーからは文字長がわかりません。これはデフォルトです。
-mixed-str-len-arg (Linux および Mac OS X) または /iface:mixed_str_len_arg が設定されると、文字列の先頭アドレスの直後に、文字長 (の値) がスタックにプッシュされます。
C ではすべての文字列がポインターであるため、文字列は文字長を伴わずに参照により渡されることを想定します。また、Fortran の文字列はヌルでは終わらないのに対し、C の文字列はヌルで終わります。Fortran と C の間で文字列を渡す方法は基本的に 2 つあります。Fortran の文字列を C の文字列に変換する方法と Fortran の文字列を受け取る C のルーチンを作成する方法です。
Fortran の文字列を C の文字列に変換するには、長さを伴わない文字列を参照により渡し、文字列をヌルで終わらせる属性の組み合わせを選択してください。次に例を示します。
INTERFACE SUBROUTINE Pass_Str (string) !DEC$ ATTRIBUTES C, DECORATE,ALIAS:'Pass_Str' :: Pass_Str CHARACTER*(*) string !DEC$ ATTRIBUTES REFERENCE :: string END SUBROUTINE END INTERFACE CHARACTER(40) forstring DATA forstring /'This is a null-terminated string.'C/
次の例は、Fortran DATA 文で文字列にヌル終端文字を使用した応用例です。
DATA forstring /'This is a null-terminated string.'C/
C インターフェイスは次のとおりです。
void Pass_Str (char *string)
C のルーチンで Fortran の文字列を受け取る場合、文字列アドレスとともに渡される文字長の引数を考慮する必要があります。次に例を示します。
! Fortran code INTERFACE SUBROUTINE Pass_Str (string) CHARACTER*(*) string END INTERFACE
C のルーチンは、2 つの引数が渡されることを想定しなければなりません。
void pass_str (char *string, unsigned int length_arg )
このインターフェイスは長さの隠し引数を処理しますが、ヌルで終わる C の文字列とヌルで終わらない Fortran の文字列との調整が必要です。また、Fortran の文字列に割り当てられているデータが宣言されている長さよりも短い場合、Fortran の文字列には空白がパディングされます。
Fortran と C の言語が混在したプログラミングでは、これらの文字列の違いを C のルーチンで処理するよりも、可能な限り C の文字列を採用することをお勧めします。Windows システムで C の文字列を使用するもう 1 つの利点は、Windows API ルーチンとほとんどの C ライブラリー関数がヌルで終わる文字列を受け取るということです。
CHARACTER*(*) 構文を使用する文字列を返す Fortran 関数は、隠し文字列引数と文字長を引数リストの最初に配置します。
このような Fortran 関数呼び出しを実装する C 関数は、この隠し文字列引数を明示的に宣言し、その引数を使用して値を返さなければなりません。C の戻り型は void です。ただし、文字列を返す関数は使用しないようにするほうが、エラーの発生を避けやすいでしょう。できる限りサブルーチンを使用するか、モジュールやグローバル変数に文字列を配置してください。
Visual Basic および MASM の情報は、Windows システムのみが対象になります。
Visual Basic の文字列は、Fortran に値で渡されなければなりません。Visual Basic の文字列は、実際には長さと位置の情報を含む構造体として格納されます。文字列を値で渡すことで、構造体を参照しないで、Fortran で想定されているとおりに、文字列の位置のみが渡されます。次に例を示します。
! In Basic Declare Sub forstr Lib "forstr.dll" (ByVal Bstring as String) DIM bstring As String * 40 Fixed-length string CALL forstr(bstring) ! End Basic code ! In Fortran SUBROUTINE forstr(s) !DEC$ ATTRIBUTES STDCALL :: forstr !DEC$ ATTRIBUTES REFERENCE :: s CHARACTER(40) s s = 'Hello, Visual Basic!' END
変数引数の Fortran 宣言子 !DEC$ ATTRIBUTES の STDCALL プロパティーと REFERENCE プロパティーはともに、Visual Basic の呼び出し側のプログラムから長さの隠し引数が渡されないことを、Fortran に通知します。STDCALL は Fortran の名前を小文字にするため、Visual Basic では名前を小文字で指定します。
デフォルトでは、MASM は、文字長とヌル文字を文字列に追加しません。文字長を追加するには、次の構文を使用します。
lenstring BYTE "String with length", LENGTHOF lenstring
ヌル文字を追加するには、次のように手作業で追加します。
nullstring BYTE "Null-terminated string", 0
Fortran プログラムで関数から CHARACTER 型のデータが返される場合、Fortran コンパイラーは呼び出されたプロシージャーの引数リストの先頭に 2 つの引数を追加します。
最初の引数は、呼び出されたプロシージャーが結果を格納する場所を示すポインターです。
2 番目の引数は、返される文字の最大文字数です (必要に応じて空白がパディングされます)。
呼び出されたルーチンは、最初の引数で指定されているアドレスに結果をコピーしなければなりません。次に、MAKECHARS という名前の文字関数を返すための Fortran コードとそれに対応する C ルーチンの例を示します。
C から Fortran への文字型の戻り例
Fortran のコード
CHARACTER*10 CHARS, MAKECHARS DOUBLE PRECISION X, Y CHARS = MAKECHARS( X, Y )
対応する C ルーチン
void MAKECHARS ( result, length, x, y ); char *result; int length; double *x, *y; { ...program text, producing returnvalue... for (i = 0; i < length; i++ ) { result[i] = returnvalue[i]; } }
上記の例では、次の制限および動作が適用されます。
関数の長さと結果は、呼び出し文では指定しません。コンパイラーによって追加されます。
呼び出されたルーチンは、result によって指定された位置に結果文字列をコピーしなければなりません。length よりも長い文字のコピーはできません。
length よりも短い文字が返された場合、戻り位置の右側に空白がパディングされます。Fortran では、文字を終了するのにゼロは使用しません。
呼び出されたプロシージャーは void 型です。
Windows では、小文字を使用した呼び出しを行うために、C ルーチンまたは Microsoft* 属性および INTERFACE ブロックには、大文字の名前を使用しなければなりません。