Setelah banyak menggali, saya telah membuat skema minuman rumahan untuk jumlah daftar string panjang variabel di Fortran. Ini benar-benar array tipe khusus yang hanya memiliki satu properti anggota yang merupakan string panjang variabel. Sintaksnya sedikit rumit dan saya bertanya-tanya apakah ada cara yang lebih baik yang belum dapat saya temukan.

Inilah yang saya miliki:

! 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

Kompilasi dengan gfortran scratch.f90 -o scratch

Kemudian:

> ./scratch
13
10
3
Vince W. 4 Juli 2020, 06:20

1 menjawab

Jawaban Terbaik

Seperti yang disarankan oleh komentar, pendekatan Anda mungkin merupakan awal yang baik. Untuk mempermudah sintaks, Anda dapat membuat beberapa operator dan prosedur terikat tipe, misalnya seperti:

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

Hasilnya adalah

 hello 
 hello fortran
           6           7
           6           7

Ini mungkin bukan desain yang paling cerdas, saya hanya mencoba sesuatu yang menarik. Di sini saya membebani operator kesatuan - untuk mengekstrak string yang sebenarnya, dan =untuk penugasan, untuk menghindari sintaks %s, dan menambahkan fungsi panjang yang lebih nyaman.

5
Jonatan Öström 4 Juli 2020, 15:35