经过大量挖掘后,我制定了一个家庭酿造方案,相当于 Fortran 中的可变长度字符串列表。它实际上是一个自定义类型的数组,只有一个成员属性,它是一个可变长度的字符串。语法有点麻烦,我想知道是否有更好的方法我还没有找到。
这是我的:
! scratch.f90
module string_list
type t_string
character(len=:), allocatable :: s
end type
end module
program main
use string_list
implicit none
integer i
type(t_string), allocatable :: list(:)
allocate(list(2))
list(1)%s = "hi my name is"
list(2)%s = "slim shady"
do i=1,2
print *, len(list(i)%s)
end do
end program
用gfortran scratch.f90 -o scratch
编译
然后:
> ./scratch
13
10
最佳答案
正如评论所暗示的那样,您的方法可能是一个好的开始。为了使语法更简单,您可以制作一些类型绑定(bind)的运算符和过程,例如:
module string_list
implicit none
type str
character(:), allocatable :: s
contains
procedure :: assa, get, length
generic :: assignment(=) => assa
generic :: operator(-) => get
generic :: l => length
end type
contains
subroutine assa(st,str1)
class(str), intent(out) :: st
character(*), intent(in) :: str1
st%s = str1
end
function get(st1) result(str1)
class(str), intent(in) :: st1
character(:), allocatable :: str1
str1 = st1%s
end
function length(st1) result(nn)
class(str), intent(in) :: st1
integer :: nn
nn = len(st1%s)
end
end
program test
use string_list, only: str
implicit none
type(str), dimension(:), allocatable :: stra
allocate(stra(2))
stra(1) = "hello "
stra(2) = "fortran"
print*, -stra(1)
print*, -stra(1)//-stra(2)
print*, stra(1)%l(), stra(2)%l()
print*, len(-stra(1)), len(-stra(2))
end
结果是
hello
hello fortran
6 7
6 7
这可能不是最聪明的设计,我只是出于兴趣尝试了一些东西。这里我重载了 -
unitary operator 来提取实际的字符串,并且 =
用于赋值,以避免 %s
语法,并添加了更多方便的长度函数。
关于string - 在 Fortran 中获取可变长度字符串列表的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62724905/