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

标签 string list fortran

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

相关文章:

windows - 我如何设置 linux 以将 FORTRAN 代码编译成 Windows 二进制文件?

c++ - Scala等与C/C++/Fortran的性能比较?

c - 如何在 C 中剪切字符串?

c# - 将列表<B>转换到列表<A>

java - Arrays.asList 是否违反了 Liskov 替换原则?

c++ - 按值将initializer_list 作为列表传递是否很昂贵?

c++ - 需要将以下 FORTRAN 代码转换为 C++

string - 如何使用 fmt.scanln 从以空格分隔的字符串中读取

php - Smith–Waterman 用于 PHP 中的字符串?

python - 将看起来像列表的字符串转换为真正的列表 - python