gpt4 book ai didi

string - 在 Fortran 中获取可变长度字符串列表的更好方法

转载 作者:行者123 更新时间:2023-12-04 02:33:50 25 4
gpt4 key购买 nike

经过大量挖掘后,我制定了一个家庭酿造方案,相当于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com