文字列の処理

デフォルトでは、インテル® 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 ではすべての文字列がポインターであるため、文字列は文字長を伴わずに参照により渡されることを想定します。また、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 での文字列の処理

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

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

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