文字列の処理

デフォルトでは、インテル® Fortran は、文字列に長さの隠れ引数を渡します。長さの隠れ引数は、符号なしの 4 バイト整数 (IA-32 システム) または 8 バイト整数 (Itanium® ベース・システム) で構成されます。常に、値により渡され、引数リストの最後に追加されます。デフォルトの文字列の渡され方は、属性を使用すると変更できます。

次の表は、渡される文字列におけるさまざまな属性の結果をまとめたものです。

属性として渡される文字列における属性プロパティの効果

引数

デフォルト

C

C, REFERENCE

文字列

長さとともに参照により渡される

最初の文字が INTEGER(4) に変換され、値により渡される

長さとともに参照により渡される

VALUE オプションを持つ文字列

エラー

最初の文字が INTEGER(4) に変換され、値により渡される

最初の文字が INTEGER(4) に変換され、値により渡される

REFERENCE オプションを持つ文字列

たいてい長さとともに参照により渡される

参照により渡される、長さは渡されない

参照により渡される、長さは渡されない

上記の表で重要な点を以下のとおりです:

C のすべての文字列はポインタであるため、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 文 (『Intel® Fortran Language Reference』(英語) の「C String」を参照) における文字列にヌル終端文字を使用した応用例です:

   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 つの引数を追加します。

呼び出されたルーチンは、最初の引数で指定したアドレスを介して結果をコピーしなければなりません。次に、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];
}
}

上記の例では、次の制限および動作が適用されます: