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,使用英特尔Visual Fortran XE 2013(启用2003语法)和Visual Studio 2012 我有一个派生类型,其组件是可分配数组。当我尝试将一个数组分配给一个数组或将可分配数组设置为一个数组时,它似乎不起作用。没有错误,但值似乎不存在 下面是一个应该说明这个问题的例子 Type myType integer :: var1, var2 real*8,dimension(:), allocatable :: listOfReals integer, d

使用英特尔Visual Fortran XE 2013(启用2003语法)和Visual Studio 2012

我有一个派生类型,其组件是可分配数组。当我尝试将一个数组分配给一个数组或将可分配数组设置为一个数组时,它似乎不起作用。没有错误,但值似乎不存在

下面是一个应该说明这个问题的例子

Type myType
    integer :: var1, var2
    real*8,dimension(:), allocatable :: listOfReals
    integer, dimension(:), allocatable :: listOfInts
end Type myType

function setTheValues(someParams) result(typeA)

    type(params_T), intent(in) :: someParams
    type(myType_T) :: typeA

    type(lists_t)  :: lists 

    typeA%var1 = 1
    typeA%var2 = 2
    !where getList is a function that returns an 
    !object with an array of real numbers and an array of ints
    lists = getLists(someParams)
    typeA%listOfReals = lists%reals
    typeA%listOfInts = lists%ints

end function setTheValues 
这不管用。也没有:

function setTheValues(someParams) result(typeA)

    type(params_T), intent(in) :: someParams
    type(myType_T) :: typeA

    type(lists_t)  :: lists


    typeA%var1 = 1
    typeA%var2 = 2

    allocate(typeA%listOfReals(12))
    allocate(typeA%listOfInts(12))

    !where getList is a function that returns an 
    !derivedtype with an array of real numbers and an array of ints both of size 12
    lists = getLists(someParams)
    typeA%listOfReals = lists%reals
    typeA%listOfInts = lists%ints

end function setTheValues
我要么得到一些信息说值不存在,它不会向我显示任何值,要么它给我一个数组,其中包含大量随机索引值和坏数据

任何帮助都将不胜感激


编辑:我在代码的其他部分也做了类似的事情,尽管调试器似乎仍然无法正确显示值,但它们似乎工作正常。

对于第一种情况,您是否
假设realloc_lhs
?除此之外,你能给出一个更完整的例子吗,特别是什么说“值不存在”?对不起,我不知道假设“realloc_lhs”是什么。VS2012调试器使用大X表示值的未定义地址。编译器选项(尽管我不熟悉VS):如果不设置(默认为非),则不会发生自动(重新)分配。您的第一个示例(至少)依赖于此F2003功能。在Visual Studio中,启用分配时重新分配语言功能的方法(假设:realloc_lhs是此功能的等效命令行选项)是将项目属性Fortran>language>enable F2003语义设置为“yes”。这改变了一些事情,而不仅仅是分配上的重新分配。正如我的问题所说,我已将F2003语义设置为“是”。您是否有理由在将代码更改为相同语法时重写代码。这一变化似乎没有什么不同。正如我前面提到的,这段代码只应该显示问题。这在我的代码中根本就没有。在我的实际代码中,我的类型有15个可分配数组,10个不可分配数组,以及20或30个其他字段。我需要知道为什么我有这个问题。特别是因为我在代码的其他地方没有问题,我认为我在做同样的事情。这段代码在gfortran和ifort中工作。这是一个完整的工作示例,而不是一个片段。如果你仔细看的话,这是不同的。我不明白你为什么要我寻找改变,但我已经注意到了不同之处。我换了。它没有解决它。您使用的是ISO_FORTRAN_ENV内部版本,它允许您使用real64语法,它不会改变我所知道的代码的任何内容。我还看到你在我访问派生类型的字段的任何地方都发生了变化,在它的两边都有一个空格,我会说我不知道你能做到。我不知道为什么我会想,除非它真的做了一些不同的事情,我不知道,因为你没有说任何关于它的事情。我试图让你弄明白,但也许我是不透明的。很抱歉你的问题已经被编辑了好几次,所以我现在不确定,但我认为关键的变化是
allocate(typeA%listOfReals(12))
。这就是为什么评论询问
假设realloc_lhs
。Fortran 2003将在分配时自动分配/重新分配(请参见3.3 of),但默认情况下,ifort中不会启用此功能。分配(typeA%listOfReals(12))和分配(typeA%listOfReals(12))之间是否存在我不知道的差异?
module MyStuff

use, intrinsic :: ISO_FORTRAN_ENV

implicit none

type myType
    integer :: var1, var2
    real (real64), dimension(:), allocatable :: listOfReals
end Type myType

contains

function setTheValues () result(typeA)
   type (myType) :: typeA

   typeA % var1 = 1
   typeA % var2 = 2

   allocate ( typeA % listOfReals(12))
   typeA % listOfReals = getList()

end function setTheValues

function getList ()

   real (real64), dimension (12) :: getList
   getList = [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ]

end function getList

end module MyStuff


program MyProg

use MyStuff

implicit none

type (myType) :: myType1

myType1 = setTheValues ()

write (*, *) myType1 % var1, myType1 % var2
write (*, *) myType1 % ListofReals

end program MyProg