2012-07-10 59 views
0

我有一个问题和一个问题(我认为它们是相关的)。Fortran90:指针数组定义为指针数组(错误ifort 11.1?)

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

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 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 

预期结果是: 甲 甲 甲

ifort 11.1给出在最后一行段故障。现在来了奇怪的事情。如果你注释掉字符串类型的整数声明,你也会在ifort 11.1中得到预期的结果。

这是编译器问题还是我使用非标准的Fortran90结构?

+0

它可能是一个编译器错误,如果它适用于'11.1.072',但不适用于早期版本的'11.1'。 – 2012-07-10 08:52:41

+0

它也适用于11.0。但通常我对编译器业务的人比对自己的能力更加信任:)。 – Stano 2012-07-10 09:13:04

+1

我总是向英特尔技术支持部门报告可疑的编译器问题(当然,当它是英特尔编译器时)。我发现它们比识别产品中的错误更好。当然,在这种情况下,他们可能会回答'是的,那是编译器版本中的一个bug,现在已经修复了。 – 2012-07-10 10:03:22

回答

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' 

观察t他完全没有分配大小string1或重新分配它的声明。

+0

是的,我已经在考虑它了。我一定要试一试。 – Stano 2012-07-10 09:25:00