1

在过去的几天里,我似乎在编码时碰壁了。据我所知,可以在 fortran ala 中创建数组数组 可变大小数组的 Fortran 数组

type par
  .... !data 
  integer :: location
end type par

type locations
  ....! data
  type (par), allocatable, dimension(:) :: pars
end type locations

type (par), allocatable, dimension(:) :: all_pars
type (locations), allocatable, dimension(:) :: all_loc

.... !read numpars, numlocs from file etc

allocate(all_pars(numpars))
allocate(all_locs(numlocs))


!initialize all_pars
do n = 1:numpars
  ....
  all_pars(n)%location = some_location
enddo

!get particles in each location 
do n = 1:numlocs
  allocate(all_locs(n)%pars(count(all_pars(:)%location .ne. n)))
  all_locs(n)%pars = pack(all_pars, (all_pars(:)%location .ne. n)) !ERROR: An assignment of different structure types is invalid.
enddo

对于上面的堆栈溢出示例,编译器不会抱怨我的等效代码行,但是当我尝试使用该数组来存储打包函数调用的结果时,它确实存在问题。我怀疑分配函数可能没有按预期运行,但由于代码无法编译,我无法调试它....

使用包的古怪想法来自http://flibs.sourceforge.net/fortran_aspects.html,大约在页面的一半。

我正在使用 ifort 12.1.3.293 的 linux 系统上运行

任何帮助深表感谢

4

1 回答 1

1

这可能是扩展评论而不是答案...

为了让它编译,我将您发布的代码修改为;

program main

implicit none

integer :: numpars, numlocs, n

type par
  !data
  integer :: location
end type par

type locations
  ! data
  type (par), allocatable, dimension(:) :: pars
end type locations

type (par), allocatable, dimension(:) :: all_pars
type (locations), allocatable, dimension(:) :: all_locs

!read numpars, numlocs from file etc
numpars = 10
numlocs = 4
allocate(all_pars(numpars))
allocate(all_locs(numlocs))


!initialize all_pars
all_pars(1:numpars:4)%location = 1
all_pars(2:numpars:4)%location = 2
all_pars(3:numpars:4)%location = 3
all_pars(4:numpars:4)%location = 4


!get particles in each location 
do n = 1,numlocs
!  allocate(all_locs(n)%pars(count(all_pars(:)%location .ne. n)))
  all_locs(n)%pars = pack(all_pars, (all_pars(:)%location .ne. n)) 
enddo
end program

它可以在我的 Mac 上使用 Intel Fortran 13.something 顺利编译。当然,由于您只发布了代码中语法稍有错误的部分,因此我不能确定这是否能告诉您很多信息。

由于您没有显示您的代码使用implicit none了您的错误,因此您的错误可能归结为all_locall_locs或其他类似问题之间的差异。

请注意,顺便提一下,对于 Fortran 可分配数组,您无需all_locs(n)%pars在通过调用 设置其值之前进行分配pack,编译器会为您处理这些问题。但是,这不是您错误的根源。

于 2013-06-25T18:28:03.350 回答