0

先日の質問で助けが必要だったので、ここで非常に単純化された例を具体化しました: 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 回参照しており、構造が何らかの形で同等ではありません。このエラーに関する情報はオンラインでほとんど見つかりませんでした。私が知る限り、私の問題に関連する情報はありません。誰かが問題を引き起こしている原因と、それをどのように分類することができるかを説明できますか? 問題が後者の場合、ユーザー定義型をモジュール間で伝播するにはどうすればよいですか?

前もって感謝します。

4

1 に答える 1

4

の使用include 'test.h'がおそらく問題の根本にあると思います...

コードを記述したら、型を宣言しparlocationsプログラム内とモジュール内の 2 つの異なるスコープで宣言します。これらの派生型は、名前が同じでも異なる型です。モジュールからプログラムにそれらを使用関連付けていないという事実は、それに影響しません。したがってall_pars、プログラム内の変数には型がありますprogram::par(いわば)。プログラム内での呼び出しalloc_locsにより、 type が生成され、そのall_locsmodule::locationsの各インスタンスには type のコンポーネントが含まれますmodule::par。ですから、この声明では

all_locs(n)%pars = pack(all_pars, (all_pars(:)%location .eq. n))

lhsではpars は typemodule::parであり、rhsでは pars は typeprogram::parです。

またはそのようなものですが、正直なところ、あなたのコードは非常に複雑です。parなぜ定義したいlocationsのか、モジュール内で単純に宣言して使用関連付けしないのか、2回も理解できません。

モジュール間でユーザー定義型を伝播するにはどうすればよいでしょうか? 答えは、1 つのモジュールで定義し、他のモジュールまたはプログラム自体から使用することです。

于 2013-06-26T22:03:22.650 に答える