2009-04-07 9 views
7

Fortran 77に関する質問があり、解決策を見つけることができませんでした。私は、次のように定義文字列の配列保存しようとしているFortran 77の文字列の配列

character matname(255)*255 

WICHが長さの255個の文字列の配列では255

後、私はから名前のリストを読み込みます

matname(matcount) = mname 

EDIT:実際mname値は以下のようにharcodedされたファイルと私はこのような配列の内容を設定しますcharacter*255mname = 'AIR'であり、これは前の行を実行する関数matadd()のパラメータである。しかしこれはテストのためだけであり、将来はファイルから読み込まれます。私はそれを印刷するに

以降:

write(*,*) matname(matidx) 

しかし、すべて255個の文字を印刷するようだ、それは私が割り当てられた文字列とごみの多くを印刷します。

  • これは私の質問ですが、格納されている文字列の長さはどのように知ることができますか?
  • 私はすべての長さの別の配列を持っていますか?
  • そして、読み込まれた文字列の長さはどのように知ることができますか?

ありがとうございます。

+1

1 - Fortranの?真剣ですか? –

+1

@イアン - なぜですか? – Rook

答えて

4

Timoteiが投稿した関数は、興味のある文字列の部分にスペースが含まれている限り、文字列の長さを返します。あなたはプログラムの値を割り当てているFORTRANは変数を空にし、空白を意味する文字を初期化することになっています。

しかし、ファイルから読み込んだ場合は、行の末尾に他の制御文字(特に、改行文字や改行文字、\ r、/または\ nなど)が表示されることがあります。 。また、正しい文字列の長さを得るために関数内にそれらを投げるべきです。さもなければそれらの文字が同様に印刷されるので面白いprintステートメントを得ることができます。

ここには、空白以外の最後の空白文字を確認する機能のバージョンがあります。

「ガベージ」セクションに他の文字がある場合、これは完全には動作しません。

write(*,*) matname(matidx)(1:strlen(matname(matidx))) 

とそれだけで実際の文字列を出力します:それはあなたのデータのための作業を行うと仮定すると

は、しかし、あなたは、このように見えるためにあなたの書き込みステートメントを変更することができます。

文字列の長さを保持するために別の配列を使用する必要があるかどうかは、あなた次第です。 strlen()関数はO(n)ですが、テーブルの長さを参照するのはO(1)です。これらの静的な文字列の長さを頻繁に計算すると、読み込み時に一度の長さを計算し、配列に格納し、必要に応じてそれらを検索するためにパフォーマンスが向上する可能性があります。しかし、あなたが減速に気付かなければ、私はそれについて心配しないでしょう。

+0

文字列をパラメータとして受け取る関数の型定義を 'character mname *(*)'に変更しなければなりませんでした。以前は、その変数の最後はランダムなガベージだったので、今は空白が埋め込まれています。 説明をいただき、ありがとうございました。また、私は*記法について知らなかった。 – Siu

5

あなたが得たが、ここから

integer function strlen(st) 
     integer  i 
     character  st*(*) 
     i = len(st) 
     do while (st(i:i) .eq. ' ') 
     i = i - 1 
     enddo 
     strlen = i 
     return 
     end 

(空白尾なし)の長さを取得するには、この機能を使用することができます:http://www.ibiblio.org/pub/languages/fortran/ch2-13.html

PS:あなたが言うとき:matname(matidxが)それは(全体の文字列を取得します256)chars ...これはあなたの文字列に空白またはゴミを加えたものです

+0

+1しかしそれがより多くのことができることを望む。 –

+0

ありがとう、私はあなたに投票したいですが、私はまだ十分な評判がありません。 – Siu

1

使用しているコンパイラに応じて、すなわち

character(len=25) :: my_string 
my_string = 'AIR' 
write (*,*) ':', trim(my_string), ':' 

、通常どおりにそれを処理し、その後、文字列から末尾のスペースを/どの大手を削除するtrim()組み込み関数を使用することができる可能性が:AIR:を印刷する必要があります。

編集: さらに、整えられた後に文字列の長さを返すlen_trim()関数があるようです。

0

intelおよびCompaq Visual Fortranには、後続の空白またはスペースを含まない長さを返す組み込み関数LEN_TRIM(STRING)があります。

あなたはこれらのFORTRANsで「左の調整」すなわちADJUSTF(STRING)

を使用し、先行ブランクまたはスペースを抑制したい場合、私はまた、便利な機能の点に注意してください。あなたに関数またはサブルーチンの中で文字列を渡す場合サブルーチン内では、サブルーチン内のLEN(STRING)関数を使用して を使用して、呼び出しプログラムで宣言された文字列の長さではなく、渡された実際の文字列長を返します。

例: CHARACTER * 1000年STRING

 . 
     . 

    CALL SUBNAM(STRING(1:72) 

    SUBROUTINE SYBNAM(STRING) 
    CHARACTER*(*) STRING 
    LEN(STRING) will be 72, not 1000 
+0

文字列の構造とその長さを使用すると、時には意味があります。 – Holmz