先日の質問で助けが必要だったので、ここで非常に単純化された例を具体化しました: fortran "array of arrays" and "pack" issues . この斬新な例は最終的に機能するようになりましたが、私のより大きなプログラムの問題は解決しませんでした。発生しているエラーをさらに理解するために、新しいプログラムを拡張して、より大きなプログラムの構造をより正確に模倣しました。これは実際に私のエラーを再現することがわかりました。私が使用したコードは次のとおりです。
test.f90
program main
use locs, only: alloc_locs,all_locs
implicit none
INCLUDE 'test.h'
integer :: numpars, numlocs, n
type (par), allocatable, dimension(:) :: all_pars
CALL alloc_locs
!read numpars, numlocs from file etc
numpars = 10
allocate(all_pars(numpars))
!initialize all_pars
all_pars(1:4)%location = 1
all_pars(5:6)%location = 2
all_pars(7:8)%location = 3
all_pars(9:10)%location = 4
!get particles in each location
do n = 1,numlocs
all_locs(n)%pars = pack(all_pars, (all_pars(:)%location .eq. n))
enddo
write(*,*) all_locs(2)%pars(1)%location
end program
test.h
type par
!data
integer :: location
end type par
type locations
! data
type (par), allocatable, dimension(:) :: pars
end type locations
locs.f90
MODULE LOCS
IMPLICIT NONE
PUBLIC
SAVE
include 'test.h'
type (locations), allocatable, dimension(:) :: all_locs
CONTAINS
SUBROUTINE alloc_locs()
integer :: numlocs
numlocs = 4
allocate(all_locs(numlocs))
END SUBROUTINE alloc_locs
END MODULE LOCS
メイクファイル
FC = ifort
OBJS = locs.o
FFLAGS = -vec-report0 -O2 -fp-model precise -standard-semantics
test : $(OBJS)
@echo " Compiling"
@$(FC) $(FFLAGS) -o test.exe test.f90 $(OBJS)
@\rm *.o *.mod
@echo " "
@echo " Compilation Successfully Completed"
@echo " "
%.o: %.f90
@echo " Compiling $<"
@$(FC) $(FFLAGS) -c $<
clean:
\rm *.o *.mod test.exe
メイクの結果:
Compiling locs.f90
Compiling
test.f90(27): error #6197: An assignment of different structure types is invalid.
all_locs(n)%pars = pack(all_pars, (all_pars(:)%location .eq. n))
---------------------^
compilation aborted for test.f90 (code 1)
私にとって、このコードと前の質問のコードは機能的には同じですが、明らかに、モジュール構造に関係する翻訳で何かが失われている、または test.h を 2 回参照しており、構造が何らかの形で同等ではありません。このエラーに関する情報はオンラインでほとんど見つかりませんでした。私が知る限り、私の問題に関連する情報はありません。誰かが問題を引き起こしている原因と、それをどのように分類することができるかを説明できますか? 問題が後者の場合、ユーザー定義型をモジュール間で伝播するにはどうすればよいですか?
前もって感謝します。