2017-12-02 22 views
2

可変長文字列を使用してNetCDFから一部のデータを読み込もうとしています。 NetCDF呼び出しを使用するには、データを格納するのに十分な大きさの文字列を指定する必要があります。しかし、私は問題にぶつかっています。Fortranで動的に文字列を割り当てるときの問題

gfortranコンパイラの奇妙な動作の問題を取り除きました。少なくとも私はそうだと思いますが、Fortran 90の機能かもしれません。ここで

サンプルコードです:

program test 
    implicit none 

    integer clen,slen 
    character(len=:), allocatable :: string 

    clen = 10 
    allocate(character(len=clen) :: string) 
    slen = len(string) 

    write(6,*) 'clen,slen,dlen: ',clen,slen,len(string) 
    string = ' ' 
    write(6,*) 'clen,slen,dlen: ',clen,slen,len(string) 
    string = 'test' 
    write(6,*) 'clen,slen,dlen: ',clen,slen,len(string) 

    end 

私が割り当てられている文字列が、しかしサイズ10

であるため、すべての3つの書き込みステートメント「10 10 10」を取得するために期待されます、ここで私が得るものです:

clen,slen,dlen:   10   10   10 
clen,slen,dlen:   10   10   1 
clen,slen,dlen:   10   10   4 

文字列は、私はそれに割り当てるたびに再割り当てされますかのように思われます。これは私が期待する行動ではありません。

gfortran(GNU Fortran(Debian 4.9.2-10)4.9.2)の古いバージョンを使用している可能性があります。私の質問です:この動作はコンパイラの新しいバージョンではなくなりますか、これはFortran 90の機能ですか?これが機能の場合、どうすればそれを避けることができますか?

+0

あなたのコードはFortran 90と互換性がありませんが、Fortran 2003です。Fortran 90は非常に古く、時代遅れです.2017年です! –

答えて

1

文字列が割り当てられるたびに文字列が再割り当てされるようです。

これはまさにそのケースです。私はあなたのコードがFortran 90と互換性がないことに注意しましょう:Fortran 2003では、いわゆる遅延文字の変数が導入されました。

遅延文字の変数は、ここではstring=...)、これは右側の式の長さになります。これはbehaviour with allocatable arraysに似ています。 allocateステートメントstring

は長さ10のものであるが、(単一ブランク)右辺の式が長さ1である

string = ' ' 

来ます。つまり、が割り当て解除され、この新しい長さに再割り当てされます。

アレイと同様

、もしサブストリングを使用して割り当てに左側の長さを保持することができる:

string(:) = ' ' 

このようなストリングが再割り当ての対象ではなく、あなたが通常の規則が表示されます固定長文字列の割り当て(右側のパディングまたはトランケーション)

最終的なコメントとして、この再割り当ては割り当ての場合です。 stringを文字列に入力するNetCDFプロシージャに渡すと、そのような再配置は行われません。NetCDFプロシージャは、仮引数を遅延長ではないと見なします。本質的な割り当てを使ったテストは、より広い動作を示すものではありません。

関連する問題