假定字符串长度输入到 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 标准的编写者一样。
我正在编写以下简单例程:
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还有第三种:假定长度函数结果。任何想了解此内容的人都可以阅读此