デフォルトでは、インテル® Fortran は、文字列に長さの隠れ引数を渡します。長さの隠れ引数は、符号なしの 4 バイト整数 (IA-32 システム) または 8 バイト整数 (Itanium® ベース・システム) で構成されます。常に、値により渡され、引数リストの最後に追加されます。デフォルトの文字列の渡され方は、属性を使用すると変更できます。
次の表は、渡される文字列におけるさまざまな属性の結果をまとめたものです。
属性として渡される文字列における属性プロパティの効果
引数 |
デフォルト |
C |
C, REFERENCE |
---|---|---|---|
文字列 |
長さとともに参照により渡される |
最初の文字が INTEGER(4) に変換され、値により渡される |
長さとともに参照により渡される |
VALUE オプションを持つ文字列 |
エラー |
最初の文字が INTEGER(4) に変換され、値により渡される |
最初の文字が INTEGER(4) に変換され、値により渡される |
REFERENCE オプションを持つ文字列 |
たいてい長さとともに参照により渡される |
参照により渡される、長さは渡されない |
参照により渡される、長さは渡されない |
上記の表で重要な点を以下のとおりです:
C ルーチンに渡される VALUE または REFERENCE の属性は、参照では渡されません。代わりに、最初の文字のみが値によって渡されます。
C ルーチンに渡される VALUE オプションを持つ文字列は、参照では渡されません。代わりに、最初の文字の値のみが渡されます。
デフォルトの ATTRIBUTES 、ATTRIBUTES C、REFERENCE を持つ文字列引数の場合:
-nomixed_str_len_arg が設定されると、文字列の長さが (値により)、スタック上のすべての引数の後にプッシュされます。これはデフォルトで使用されます。
-mixed_str_len_arg が設定されると、文字列の長さが (値により)、スタック上のその文字列の開始アドレスの直後にプッシュされます。
デフォルトの ATTRIBUTES とともに参照により渡される文字列引数の場合:
-nomixed_str_len_arg が設定されると、呼び出されるプロシージャで文字列の長さは使用できません。これはデフォルトで使用されます。
-mixed_str_len_arg が設定されると、文字列の長さが (値により)、スタック上のその文字列の開始アドレスの直後にプッシュされます。
C のすべての文字列はポインタであるため、C は文字列が文字列の長さを伴わずに参照により渡されることを想定します。また、Fortran 文字列はヌルでは終わらないのに対し、C 文字列はヌルで終わります。Fortran と C 間で文字列を渡す方法は基本的に 2 つあります。Fortran の文字列を C の文字列に変換する方法と Fortran の文字列を受け付ける C のルーチンを書く方法です。
Fortran 文字列を C 文字列に変換するには、参照により文字列を長さを伴わずに渡し、文字列をヌルで終わらせる属性の組み合わせを選択してください。次に例を示します。
次の例は、Fortran DATA 文 (『Intel® Fortran Language Reference』(英語) の「C String」を参照) における文字列にヌル終端文字を使用した応用例です:
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/
DATA forstring /'This is a null-terminated string.'C/
C インターフェイスは次のとおりです:
void Pass_Str (char *string)
C のルーチンで Fortran の文字列を受け取るには、C は文字列アドレスとともに文字長の引数が渡されることを念頭に置かなくてはなりません。次に例を示します。
!Fortran のコード
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 の文字列を採用することをお勧めします。
CHARACTER*(*)
構文を使用する文字列を返す Fortran 関数は、隠れ文字列引数と文字列の長さを引数リストの最初に配置します。
Fortran 関数コールなどを実装する C 関数はこの隠れ文字列引数を明示的に宣言しなければならず、またその引数を使用して値を返さなければなりません。C の戻り型は void です。ただし、文字列を返す関数は使用しないようにする方が、エラーの発生を避けやすいでしょう。できる限りサブルーチンを使用するか、モジュールやグローバル変数に文字列を配置してください。
Fortran プログラムで関数から CHARACTER 型のデータが返されると予測した場合、Fortran コンパイラは呼び出されたプロシージャの引数リストの先頭に 2 つの引数を追加します。
最初の引数は、呼び出されたプロシージャが結果を格納する位置を示すポインタです。
2 番目の引数は、返される文字の最大文字数です(必要に応じて空白をパディングします)。
呼び出されたルーチンは、最初の引数で指定したアドレスを介して結果をコピーしなければなりません。次に、MAKECHARS という名前の文字関数を返すための Fortran コードとそれに対応する C ルーチンの例を示します。
C から Fortran への文字型の戻り例
Fortran のコード |
対応する C ルーチン |
上記の例では、次の制限および動作が適用されます:
関数の長さと結果は、呼び出し文で指定するのではありません。 コンパイラによって追加します。
呼び出されたルーチンは、result によって指定した位置に結果文字列をコピーしなければなりません。 length よりも長い文字のコピーはできません。
length よりも短い文字が返された場合、戻り位置の右側に空白がパディングされます。Fortran では、文字を終了するのにゼロは使用しません。
呼び出されたプロシージャは void 型です。
小文字を使用した呼び出しを行うために、C ルーチンまたは INTERFACE ブロックには、小文字の名前を使用しなければなりません。