1

我有一个问题和一个问题(我认为它们是相关的)。

问题:我可以在 Fortran 90 中使用定义为指针的指针数组吗?

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

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

问题:我有代码(见下文),ifort 11.1 在最后一次写入时给出了段错误。其他编译器,例如 gfortran 4.6.3、ifort 11.1.072、12.0.1 等,都可以正常工作

您可以将代码视为 Python 附加功能的模拟。

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

使用 Intel Fortran 13.0.something,您的代码可以毫无问题地编译和执行。结合您使用其他编译器和编译器版本的经验,这确实表明存在编译器错误,尽管现在已更正。

我不完全确定 Python append 函数的作用,但如果您正在寻找一种 Fortran 方法来制作其内容(和长度)可以动态更改的字符串,您应该认真考虑使用 Fortran 2003 自动分配功能。例如,您可以像这样定义一个字符串:

character(len=:), allocatable :: string1

给它一个这样的值:

string1 = 'this is string 1'

并给它另一个像这样的值:

string1 = 'this is'

或者像这样

string1 = string1//' more text'

观察完全没有分配大小string1或重新分配大小的语句。

于 2012-07-10T09:09:58.037 回答