Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.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,我有一个Fortran类型,它有一个条目,它又是一个类型。此类型具有可分配的整数数组: type inner integer, allocatable :: dyn_arr(:) integer another_var end type type outer type(inner) entry type(inner) another_entry end type 我分配数组,然后调用一个子例程。在子例程中,我想访问数组 type(outer) main_stru

我有一个Fortran类型,它有一个条目,它又是一个类型。此类型具有可分配的整数数组:

type inner
    integer, allocatable :: dyn_arr(:)
    integer another_var
end type
type outer
    type(inner) entry
    type(inner) another_entry
end type
我分配数组,然后调用一个子例程。在子例程中,我想访问数组

type(outer) main_struct

allocate(main_struct%entry%dyn_arr(100))
call routi(main_struct)

我的代码有错误。当我使用调试器运行时,在调用之前,一切似乎都正常,当我输入子例程
routi
时,调试器说
dyn\u arr
未分配。这怎么可能呢?

我创建了一个简短的程序来测试这一点,没有任何问题。你能发布一个简短的程序来说明这个失败吗

以下是使用gfortran 4.5编译时运行良好的代码:

  MODULE temp_module
    TYPE inner
       INTEGER, ALLOCATABLE :: dyn_arr(:)
       INTEGER another_var
    END TYPE inner
    TYPE outer
       TYPE(inner) entry
       TYPE(inner) another_entry
    END TYPE outer
  CONTAINS

    SUBROUTINE test (input)
      TYPE(outer), INTENT(in) :: input
      WRITE(*,*) input%entry%dyn_arr
    END SUBROUTINE test

  END MODULE temp_module

  PROGRAM XC_VMEC_SIGHTLINE
    USE temp_module
    TYPE(outer) main_struct

    ALLOCATE(main_struct%entry%dyn_arr(10))
    CALL test(main_struct)
  END PROGRAM XC_VMEC_SIGHTLINE

我创建了一个简短的程序来测试这个,没有任何问题。你能发布一个简短的程序来说明这个失败吗

以下是使用gfortran 4.5编译时运行良好的代码:

  MODULE temp_module
    TYPE inner
       INTEGER, ALLOCATABLE :: dyn_arr(:)
       INTEGER another_var
    END TYPE inner
    TYPE outer
       TYPE(inner) entry
       TYPE(inner) another_entry
    END TYPE outer
  CONTAINS

    SUBROUTINE test (input)
      TYPE(outer), INTENT(in) :: input
      WRITE(*,*) input%entry%dyn_arr
    END SUBROUTINE test

  END MODULE temp_module

  PROGRAM XC_VMEC_SIGHTLINE
    USE temp_module
    TYPE(outer) main_struct

    ALLOCATE(main_struct%entry%dyn_arr(10))
    CALL test(main_struct)
  END PROGRAM XC_VMEC_SIGHTLINE
我想在routi你是有意向的,不是吗

实际参数的已分配最终可分配组件,该参数 与在上解除分配的意图(OUT)伪参数关联 程序输入,以便假人的相应部件 参数的分配状态为“当前未分配”

这样可以确保指向的任何指针都指向 变量的可分配组件变得未定义

永远不要使用意图(out)。这是邪恶的。

我想在routi()中你是有目的的,不是吗

实际参数的已分配最终可分配组件,该参数 与在上解除分配的意图(OUT)伪参数关联 程序输入,以便假人的相应部件 参数的分配状态为“当前未分配”

这样可以确保指向的任何指针都指向 变量的可分配组件变得未定义


永远不要使用意图(out)。这很糟糕。

除了胡乱猜测之外,您还没有显示足够的信息。对不起,问题是我调用了routi(a,b),但定义了子程序routi(b,a)。我只是不希望问题如此简单,因为我一直面临着Stefano所描述的那种(对我来说很奇怪)问题。除了猜测之外,你还没有展示足够的信息。对不起,问题是我调用了routi(a,b),但定义了子程序routi(b,a)。我只是不希望问题如此简单,因为我一直面临着Stefano所描述的那种问题。@eriktous:intent(out)的恰当用法不是在复杂类型上使用intent(out)。我们在这个垃圾上浪费了数周的时间。这个特性和它的行为都有明确的记录。如果适用的话,使用它是非常好的(很多人甚至会说是推荐的)。当然,当它的含义与伪参数的预期用法冲突时,您不应该使用它,但这并不保证一个笼统的“don't use”语句。如果您希望“信息”流入和流出过程,那么intent应该是“inout”。如果将意图声明为“out”,则意味着过程中没有任何内容,编译器可以丢弃现有内容和参数状态。该参数仅在过程内部和退出过程时具有意义。这是有道理的。@M.S.B:我从来没说过这是没有道理的。我说这很危险,因为你很可能会接触到这些微妙之处。而且,我认为投下我的票是很愚蠢的,因为我可能是对的(问题不允许歧视)。对于intent(out),分配状态在进入过程时丢失,因此不能在子例程之外分配内存。它与是否是用户定义(复杂)类型无关。请参阅“Fortran 95/2003解释版”第240页,了解对此的讨论——如果您在“可分配参数intent out”上搜索,google将显示此页面。@eriktous:intent(out)的适当用法不是在复杂类型上使用intent(out)。我们在这个垃圾上浪费了数周的时间。这个特性和它的行为都有明确的记录。如果适用的话,使用它是非常好的(很多人甚至会说是推荐的)。当然,当它的含义与伪参数的预期用法冲突时,您不应该使用它,但这并不保证一个笼统的“don't use”语句。如果您希望“信息”流入和流出过程,那么intent应该是“inout”。如果将意图声明为“out”,则意味着过程中没有任何内容,编译器可以丢弃现有内容和参数状态。该参数仅在过程内部和退出过程时具有意义。这是有道理的。@M.S.B:我从来没说过这是没有道理的。我说这很危险,因为你很可能会接触到这些微妙之处。而且,我认为投下我的票是很愚蠢的,因为我可能是对的(问题不允许歧视)。对于intent(out),分配状态在进入过程时丢失,因此不能在子例程之外分配内存。它与是否是用户定义(复杂)类型无关。请参阅“Fortran 95/2003解释版”第240页,以了解对此的讨论——如果您在“可分配参数输出”上搜索,google将显示此页。