1

1 つの質問と 1 つの問題があります (関連していると思います)。

質問: ポインターとして定義されたポインター配列の Fortran 90 配列を使用できますか?

type string
  character, pointer :: str(:)
end type

type(string), pointer :: arr(:)

問題: ifort 11.1 が最後の書き込みで segfault を与えるコード (以下を参照) があります。gfortran 4.6.3、ifort 11.1.072、12.0.1 などの他のコンパイラは問題なく動作しました。

コードは、Python の append 関数のシミュレーションと考えることができます。

program test
implicit none

type string
  integer,   pointer :: key
  character, pointer :: str(:)
end type

type(string), pointer :: arr(:), tmp(:)

allocate(arr(1))
allocate(arr(1)%str(1))
arr(1)%str(1) = 'A'
write(6,*) arr(1)%str(1)

! --------------------

tmp => arr
write(6,*) tmp(1)%str(1)

! --------------------

nullify(arr)
allocate(arr(2))
arr(1)%str => tmp(1)%str
write(6,*) arr(1)%str(1)

end program

期待される結果は次のとおりです。

A
A
A

ifort 11.1 では、最後の行でセグメンテーション違反が発生します。今、奇妙なことが来ます。文字列型の整数の宣言をコメントアウトすると、ifort 11.1 でも期待される結果が得られます。

これはコンパイラの問題ですか、それとも非標準の Fortran 90 構造を使用していますか?

4

1 に答える 1

2

コードは、IntelFortran13.0.somethingを使用して問題なくコンパイルおよび実行されます。他のコンパイラおよびコンパイラバージョンでの経験と合わせて、これはコンパイラのバグを示唆していますが、現在は修正されています。

Pythonのappend関数が何をするのか完全にはわかりませんが、内容(および長さ)が動的に変化する文字列を作成するFortranの方法を探している場合は、Fortran2003の自動割り当て機能の使用を真剣に検討する必要があります。たとえば、次のような文字列を定義できます。

character(len=:), allocatable :: string1

次のような値を指定します。

string1 = 'this is string 1'

そしてそれに次のような別の値を与えます:

string1 = 'this is'

またはこのように

string1 = string1//' more text'

サイズを割り当てたり、再割り当てしたりするステートメントが完全に不足していることにstring1注意してください。

于 2012-07-10T09:09:58.037 に答える