在Fortran中返回不同长度的字符串数组

时间:2018-08-22 14:08:00

标签: arrays string types fortran character

我想在Fortran中创建一个包含字符串数组的类型,而无需显式分配长度,这样我就可以从函数中返回它。

以下是我的类型:

begin program.
import spssdata
majors = []
for case in spssdata.Spssdata('mq1'):
    major = case[0]
    if major not in majors:
        majors.append(major)
print majors
end program.

以下是函数的签名:

'None'

以下是我尝试设置结果的地方:

type returnArr
    Character (*), dimension(4)  :: array
end type returnArr

但是我得到的只是以下错误:

type(returnArr) FUNCTION process(arr, mean, stdDev) result(j)

如何声明类型,以使字符串的长度可以不同?

1 个答案:

答案 0 :(得分:2)

派生类型的字符组件可以具有明确的长度,也可以具有其长度 deferred 。后者是一种如何(通过多种方式)改变其值的方法。还必须在派生类型的数组中允许不同长度的灵活性。

但是,使用len=*并不是说“递延长度”(这是“假定长度”)的正确方法。相反,您可以使用len=:并使组件可分配(或指针):

type returnArr
  Character (:), allocatable  :: char
end type returnArr

然后可能有一个returnArr对象的数组:

function process(arr, mean, stdDev) result(j)
  type(returnArr) :: j(4)
end function

诸如以下的分配

  j(1)%char = "Test"

然后依靠组件char的自动分配。

请注意,现在函数结果是该容器类型的数组。我们不能做

function process(arr, mean, stdDev) result(j)
  character(:), allocatable :: j(:)
end function

并将j(1)分配给与j(2)(例如,等)不同的长度。

类似地

type returnArr
  Character (:), allocatable  :: char(:)
end type returnArr

不允许这些char组成元素具有不同的长度。