2017-03-14 5 views
1

私は、使用するサブルーチンのサードパーティスクリプトを用意しています。このサブルーチンは次のとおりです文字変数の生成のための文字*(*)

Subroutine COpen(io, Name) 
     Character*(*) Name 
     Character*1023 NameIn, NameOut 
     NameIn = Trim(Name)//' ' 
     Call Get_OrMakeFileName(NameIn, NameOut) 
     Open(io,file=NameOut,access="APPEND") 
    End 

私はCharacter*(*) nameの構文を理解していません。単純に文字列変数を宣言する典型的な方法ではありません。 character :: name*4*4部分の文字数を指定していますか?誰でもこの代替構文の目的を説明できますか?どのようなオブジェクトが生成されますか?

答えて

2

簡潔に:character*(*)は、想定される長さの文字変数を宣言します。

文字変数の長さを宣言する方法はいくつかあります。質問のコードで見られるように、1つは、リテラル定数は*次の

character*1023 ... 

です。それに相当するのは、

character([len=]1023) ... 

len=はオプション)です。この場合、長さはリテラル定数である必要はありません。

これらの2つの形式は、特定の長さの変数を宣言します。文字変数の長さには2つの他の形式があります。

  • 想定長さ - character([len=]*) ...;
  • 遅延長 - character([len=]:) ...character*1023と同様

仮定及び繰延長宣言はこのスタイルで書かれることがあります。

character*(*) ...  ! Assumed length 
character*(:) ...  ! Deferred length 
character*(1023) ... ! For completeness 

まあ、「想定の長さは、」何を意味するのでしょうか?

Nameなどの仮引数の場合、長さはプロシージャの実際の引数の長さから取られます。 character :: Name*4では、サブルーチンへの引数の長さにかかわらず(長さが少なくとも4である限り)、引数の長さは4です。ダミーが仮定された長さの場合、引き数の長さが12であれば長さは12であり、以下同様です。


ない問題になっているが、一定の名前の文字も定義式からその長さをとることができる:

character*(*), parameter :: label='This long' 

繰延長さは、他の質問に委ねられています。

+0

ありがとうございます。あなたのフォローアップの質問もチェックしてもよろしいですか?私は少し問題を単純化しました。http://stackoverflow.com/questions/42787131/fortran-assumed-string-length-input-into-function – user32882

関連する問題