Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 奇怪的错误链接的结果:";不同结构类型的赋值无效。”;_Fortran - Fatal编程技术网

Fortran 奇怪的错误链接的结果:";不同结构类型的赋值无效。”;

Fortran 奇怪的错误链接的结果:";不同结构类型的赋值无效。”;,fortran,Fortran,前几天我在一个问题上需要一些帮助,并在这里充实了一个非常简单的示例:。这个新颖的例子最终成功了,但它并没有解决我更大程序的问题。为了进一步理解我得到的错误,我扩展了新程序,以更准确地模拟我的大程序的结构。事实证明,这确实再现了我的错误。以下是我使用的代码片段: test.f90 program main use locs, only: alloc_locs,all_locs implicit none INCLUDE 'test.h' integer :: numpars, numlocs,

前几天我在一个问题上需要一些帮助,并在这里充实了一个非常简单的示例:。这个新颖的例子最终成功了,但它并没有解决我更大程序的问题。为了进一步理解我得到的错误,我扩展了新程序,以更准确地模拟我的大程序的结构。事实证明,这确实再现了我的错误。以下是我使用的代码片段:

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
测试h

type par
  !data
  integer :: location
end type par

type locations
  ! data
  type (par), allocatable, dimension(:) :: pars
end type locations
Lcs.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
对我来说,这段代码和上一个问题中的代码在功能上是相同的,但是很明显,在翻译过程中丢失了一些与模块结构有关的东西,或者两次引用test.h,而结构不知何故是不等价的。我在网上几乎找不到关于这个错误的信息,而且据我所知,没有任何与我的问题相关的信息。有人能解释一下是什么导致了这些问题,以及我可能如何进行分类?如果问题是后者,如何在模块之间传播用户定义的类型


提前谢谢

我认为您使用的
包括'test.h'
可能是您问题的根源

编写代码时,在两个不同的范围内声明类型
par
位置
,一次在程序内,一次在模块内。这些派生类型是不同的类型,尽管它们具有相同的名称。您没有使用将它们从模块关联到程序这一事实并不影响这一点。因此,程序中的变量
all_par
的类型为
program::par
(原样)。程序内部对
alloc\u locs
的调用导致
all\u locs
具有类型
module::locations
,并且该类型的每个实例都具有类型
module::par
的组件。所以在这个声明中

all_locs(n)%pars = pack(all_pars, (all_pars(:)%location .eq. n))
在左侧,par类型为
模块::par
,在右侧,par类型为
程序::par

或者类似的,但老实说,我发现你的代码非常复杂。我不明白您为什么要定义两次
par
位置
,为什么不在模块内简单地声明它们并使用关联它们


您会问,如何在模块之间传播用户定义的类型?答案是您在一个模块中定义它,然后从其他模块或程序本身使用它。

我认为您使用的
包括'test.h'
可能是您问题的根源

编写代码时,在两个不同的范围内声明类型
par
位置
,一次在程序内,一次在模块内。这些派生类型是不同的类型,尽管它们具有相同的名称。您没有使用将它们从模块关联到程序这一事实并不影响这一点。因此,程序中的变量
all_par
的类型为
program::par
(原样)。程序内部对
alloc\u locs
的调用导致
all\u locs
具有类型
module::locations
,并且该类型的每个实例都具有类型
module::par
的组件。所以在这个声明中

all_locs(n)%pars = pack(all_pars, (all_pars(:)%location .eq. n))
在左侧,par类型为
模块::par
,在右侧,par类型为
程序::par

或者类似的,但老实说,我发现你的代码非常复杂。我不明白您为什么要定义两次
par
位置
,为什么不在模块内简单地声明它们并使用关联它们


您会问,如何在模块之间传播用户定义的类型?答案是,您可以在一个模块中定义它,然后从其他模块或程序本身使用它。

非常感谢,我理解为什么现在会发生这种情况,但我还没有接近修复它。为了我的目的,我不想(我真的不能)实例化一个模块中的所有内容。当然,较大的代码是一个复杂得多的程序。有些变量主要需要是全局变量,有些需要稍后读入并通过另一个模块实例化。碰巧的是,其中一个是用户定义的类型,它们需要相互交互。所以我在问,如何将类型定义从一个模块传播到另一个模块,以使它们等效?有可能吗?没关系,我看起来很笨。我没有意识到我可以在main的顶部调用USE,通过一个尚未运行的模块来获取type defs。非常感谢你对我的两个问题的回答。非常感谢,我理解为什么现在会发生这种情况,但我还没有接近解决它。为了我的目的,我不想(我真的不能)实例化一个模块中的所有内容。当然,较大的代码是一个复杂得多的程序。有些变量主要需要是全局变量,有些需要稍后读入并通过另一个模块实例化。碰巧的是,其中一个是用户定义的类型,它们需要相互交互。所以我在问,如何将类型定义从一个模块传播到另一个模块,以使它们等效?有可能吗?没关系,我看起来很笨。我没有意识到我可以在main的顶部调用USE,通过一个尚未运行的模块来获取type defs。非常感谢你回答我的两个问题。