假定字符串长度输入到 Fortran 函数中

Assumed string length input into a Fortran function

我正在编写以下简单例程:

program scratch
    character*4 :: word
    word = 'hell'
    print *, concat(word)
end program scratch

function concat(x)
    character*(*) x
    concat = x // 'plus stuff'
end function concat

程序应该获取字符串 'hell' 并将字符串 'plus stuff' 连接到它。我希望该函数能够接收任何长度的字符串(我也打算使用 'heaven' 这个词)并将字符串 'plus stuff'.

连接到它

目前,当我在 Visual Studio 2012 年 运行 执行此操作时,出现以下错误:

Error 1 error #6303: The assignment operation or the binary expression operation is invalid for the data types of the two operands. D:\aboufira\Desktop\TEMP\Visual Studio\test\logicalfunction\scratch.f90 9

此错误针对以下行:

concat = x // 'plus stuff'

我不清楚为什么这两个操作数不兼容。我已将它们都设置为字符串。他们为什么不串联?

High Performance Mark 的 告诉您编译器为什么会抱怨:隐式类型。

函数 concat 的结果是隐式类型的,因为您没有另外声明它的类型。尽管 x // 'plus stuff' 是连接字符变量的正确方法,但您正试图将该新字符对象分配给(隐式)实函数结果。

这导致了问题:"just how do I declare the function result to be a character?"。答案:与任何其他字符变量一样:

character(len=length) concat

[请注意,我使用 character(len=...) 而不是 character*...。稍后我会详细说明原因,但我也会指出 character*4 形式根据当前 Fortran 已过时,最终可能会被完全删除。]

棘手的部分是:应该声明的长度是多少?

当声明我们事先不知道的字符函数结果的长度时,有两种1方法:

  • 自动角色对象;
  • 延迟长度字符对象。

在这个函数的例子中,我们知道结果的长度比输入长10。我们可以声明

character(len=LEN(x)+10) concat

为此,我们不能使用 character*(LEN(x)+10).

形式

在更一般的情况下,延迟长度:

character(len=:), allocatable :: concat  ! Deferred length, will be defined on allocation

以后

concat = x//'plus stuff'  ! Using automatic allocation on intrinsic assignment

使用这些形式增加了函数 concat 在主程序中具有显式接口的要求。您会在其他问题和资源中找到很多相关信息。提供显式接口也将消除在主程序中 concat 也隐式具有真实结果的问题。

强调:

program
  implicit none
  character(len=[something]) concat
  print *, concat('hell')
end program

不适用于 concat 具有 "length unknown at compile time" 形式的结果。理想情况下,函数将是一个内部函数,或者是从模块访问的函数。


1还有第三种:假定长度函数结果。任何想了解此内容的人都可以阅读此 。其他人都应该假装这不存在。就像 Fortran 标准的编写者一样。