Arrays “的本机Fortran类型签名”;可变长度字符串列表";?

Arrays “的本机Fortran类型签名”;可变长度字符串列表";?,arrays,string,fortran,Arrays,String,Fortran,在Fortran中,是否有任何方法可以声明“可分配数组的数组”,而不需要将可分配数组包装成派生类型 我的主要用例是允许使用可变长度字符串数组调用函数,也就是说,我正在寻找与文本匹配的类型签名 ["Hello", & "World.", & "How are you?"] 动机 在Fortran语言中,字符串本机表示为固定大小的字符数组,右边用空格填充。字符串数组通常表示为(等长)字符数组的数组,我假设这是为了使它们的行为类似于字符矩阵 然而,这也意味着 CALL mySu

在Fortran中,是否有任何方法可以声明“可分配数组的数组”,而不需要将可分配数组包装成派生类型

我的主要用例是允许使用可变长度字符串数组调用函数,也就是说,我正在寻找与文本匹配的类型签名

["Hello", &
 "World.",  &
 "How are you?"]
动机 在Fortran语言中,字符串本机表示为固定大小的字符数组,右边用空格填充。字符串数组通常表示为(等长)字符数组的数组,我假设这是为了使它们的行为类似于字符矩阵

然而,这也意味着

CALL mySubroutine(["Hello","World.","How are you?"])
将导致编译器错误,如

Error: Different CHARACTER lengths (5/4) in array constructor at (1)
通常建议的一种解决方法(请参见示例)是使用派生类型数组,例如

TYPE string
   CHARACTER(LEN=:), ALLOCATABLE :: chars
END type string
! ...
CALL myStringSubroutine([string("Hello"), &
                         string("World."),  &
                         string("How are you?")])
然而,由于没有这种标准化的
string
类型,我经常看到API使用本机支持的“变通方法”,例如使用固定大小的字符串,并在使用时对其进行修剪。在本例中,调用如下所示

CALL myFixedSubroutine(["Hello       ", &
                        "World.      ", &
                        "How are you?"])
虽然这在原则上没有问题,但如果其中一个字符串比其他字符串长得多,它可能会变得笨拙和低效。它对版本控制也有影响,现在将
“…you?”
更改为
“…you?”
意味着必须更改其他行的填充,从而产生虚假差异


(在评论中,有人建议至少自动填充空格。)

不,包装器类型没有方法栏

该语言的一个基本概念是数组中的元素只能在值上变化。对象的分配状态不是该对象值的一部分

(组件的分配状态是包含该组件的对象值的一部分。)


Fortran标准的第2部分描述了变长字符串类型。

Fortran中没有本机列表类型。只有Fortran数组。数组不是列表。internet上有一些派生列表类型的实现,甚至在这里也经常出现。请注意,数组构造函数
[字符(135):“你好”,“世界”,“你好吗?”]
解决了您的一些问题。@VladimirF可能没有本机列表类型,但数组通常可以以相同的方式使用,当不需要可变长度时。我所寻找的基本上归结为使用“数组数组”而不是“秩2数组”。虽然后者显然在矩阵性能方面更好,但前者通常更适合于围绕计算的基础结构代码。@这里也多次提到了kdb数组。还有使用几乎相同的包装器的指针数组。只需将指针组件与字符组件切换即可。其实是一样的,非常简单。我知道你把它称为一种变通方法,但通常情况下,这确实是一个值得去做的事情。如果你已经知道的话,我不确定问题是什么。@VladimirF包装器写起来很简单,但它们使代码更难阅读,所以我正在试图找到一个不需要它们的解决方案。对于指针,虽然
TYPE(string)
更适合用于此类变量参数,但在任何其他地方都会变得不那么有用,因为指针可能最终指向空闲的内存。我正在寻找改进静态检查功能的方法,因此使用
指针将是一种倒退。您能详细介绍一下“基本概念”部分吗?我知道,为了提高数值运算的性能,该语言将适当的秩N数组放在前面和中间。然而,我不明白,为什么这会妨碍创建可分配数组或指针数组的能力。(除此之外:感谢您参考iso_variabling_string
,尽管我不明白为什么它是可选的。)基本操作是如何工作的?序列关联是如何工作的?如果将数组视为“指针数组”,而不是多维值数组,那么序列关联就可以正常工作。元素操作可以递归地应用于数组的最内层,尽管我可以看到这使得实现更加复杂;但是,有点缺少了一点:“指针数组”与多维数组相比有着非常不同的使用场景,因此,尽管元素操作将“很好地拥有”,但与避免使用自组织封装相比,我几乎不认为它们是重要的。