我有一个问题和一个问题(我认为它们是相关的)。
问题:我可以在Fortran90中使用定义为指针的指针数组吗?
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追加函数的模拟。
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
预期结果是: 一个 一个 甲
ifort 11.1在最后一行给出了分段错误。现在来了奇怪的事情。如果你在类型字符串中注释掉整数声明,你也会得到ifort 11.1的预期结果。
这个编译器问题还是我使用的是非标准的Fortran90结构?
答案 0 :(得分:1)
使用英特尔Fortran 13.0.something,您的代码可以毫无问题地编译和执行。结合您对其他编译器和编译器版本的经验,这确实提出了一个编译器错误,尽管现在已经纠正了。
我不完全确定Python追加函数的作用,但如果您正在寻找Fortran方法来创建其内容(和长度)可以动态更改的字符串,那么您应该认真考虑使用Fortran 2003自动分配功能。例如,您可以定义如下字符串:
character(len=:), allocatable :: string1
给它一个这样的值:
string1 = 'this is string 1'
并给它另一个这样的值:
string1 = 'this is'
或者像这样
string1 = string1//' more text'
观察完全没有分配string1
大小或重新分配它的语句。