Fortran:在主程序中初始化长度未知的字符串 [英] Fortran: Initialize character string with unknown length in main program

查看:65
本文介绍了Fortran:在主程序中初始化长度未知的字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个字符串,我想用子例程调用的意图(输出)数据进行初始化。我看起来有点像:

character(*) :: path
call get_path(path)

编译器告诉我:

错误:假定字符长度位于(%1)的实体必须是伪实体 参数或参数

该构造在子例程中工作得很好,但在主程序中失败。是否可以在不知道其长度的情况下初始化PATH变量?

编辑:我已尝试的内容,但失败。

character(99) :: path_temp
character(:), allocatable :: path
call get_path(path_temp)
allocate(path(len(trim(path_temp))))

错误:(%1)处的可分配标量的形状规范

我不明白为什么编译器认为路径是标量。


返回假定长度字符的函数显然是非法的。

character(*) function get_path ()
    get_path         =     '/path/to/folder/'
end function get_path

错误:(%1)处的字符值模块过程"get_path"不能假定长度


有效但让我头疼的是,我发现它的风格非常糟糕,那就是赋予path一个疯狂的长度,并在每次使用它时对其进行修剪。我认为我的编译器在可分配字符串方面遇到了问题,因为它不是很新(Mpif90)。不确定它是否支持它们。

推荐答案

许多要点都包含在注释链接的其他答案中,例如"假定长度"需要什么,以及如何分配标量延迟长度字符变量。

在得出特定答案之前,我将指出两点。

对延迟长度可分配标量字符变量的内部赋值会导致(如果需要)将该变量分配给表达式的长度。这是

character(99) :: path_temp
character(:), allocatable :: path

call get_path(path_temp)
allocate(character(len(trim(path_temp))) :: path)  ! Note the correct form
path = TRIM(path_temp)  ! Or path(:)=path_temp

可以替换为

character(99) :: path_temp
character(:), allocatable :: path

call get_path(path_temp)
path = TRIM(path_temp)
需要注意的另一件事是相当迂腐的,但是不正确地使用术语可能会阻碍搜索。Fortran中的初始化表示此处不适用的特定内容。

根据编译器错误消息,您说带有假定长度字符结果的函数显然是非法的

错误:(%1)处的字符值模块过程"get_path"不能假定长度

这并不完全正确:在某些情况下,字符函数结果可以(目前-它是现代Fortran的一个过时特性)具有假定的长度。不过,它们必须是外部函数。确保编译器报告模块过程(因此该过程不是外部过程)。

也就是说,具有假定长度的字符结果对您没有帮助。仍需假定结果的长度来自某项内容,并且某些内容不在函数体中,而是定义作用域中的外部函数的声明。

类似于

implicit none

character(99) get_path    ! The length of the get_path result is assumed from here
character(:), allocatable :: path

path = TRIM(get_path())
...

因为您似乎完全控制子例程get_path,所以有最后一个值得回答的评论。您可以直接将参数设置为可分配的。

subroutine get_path(path)
  character(:), allocatable, intent(out) :: path
  path = '/path/to/folder/'   ! Allocation through intrinsic assignment
  path = TRIM(path)           ! In general, if it's likely to have trailing blanks
end subroutine

这篇关于Fortran:在主程序中初始化长度未知的字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆