【问题标题】:Fortran: Automatic determination of character length during initializationFortran:初始化期间自动确定字符长度
【发布时间】:2014-04-01 14:29:46
【问题描述】:

Fortran 中,是否可以在声明期间使用初始化程序时自动扣除字符(字符串)的长度?我想要这样的东西(不工作)

  character(*) :: a = 'John Doe'
  character(:) :: a = 'John Doe'

示例代码

program char
  implicit none

  character(8) :: a = 'John Doe' !<-automatically?

  write(*,*) a
  write(*,*) len(a)

end program char

一种正确的方法是使用

  character(8) :: a = 'John Doe'

通过简单地计算字符,但这很容易出错。或者,我可以使字符长于必要并使用trim()

program char
  implicit none

  character(100) :: a = 'John Doe'

  write(*,*) trim(a)
  write(*,*) len(trim(a))

end program char

但是8 可以自动确定吗?我知道这是一个学术问题,但我仍然想知道......

【问题讨论】:

    标签: fortran character


    【解决方案1】:

    除了@AlexanderVogt 使用parameter 的解决方案,您还可以在Fortran 2003 中使用自动分配,像这样:

    character(len=:), allocatable :: name
    

    然后像这样初始化

    name = 'John Doe'
    

    并以同样的方式重置

    name = 'John Doe Jr'
    

    【讨论】:

    • 如果使用allocatable 那么是否必须使用deallocate 变量?想知道,因为没有明确调用allocate()
    • 通常,allocatables 一旦超出范围就会被释放,除非它们具有save 属性。我还读到,在主程序中使用 Fortran 2008 allocatables 不一定会被释放,但我现在找不到参考...
    • 好吧,当程序终止运行时应该将所有内存交还给操作系统,这是一种释放。
    • 但在此之前它没有被释放也没有最终确定。这对于派生类型可能很重要。此外,valgrind 可能会注意到仍有一些可访问的堆块。
    【解决方案2】:

    对于参数和虚拟参数,您可以使用character(len=*)

    program char
      implicit none
    
      character(100) :: a = 'John Doe'
      character(len=*),parameter :: b = 'John Doe'
    
      write(*,*) trim(a)
      write(*,*) len_trim(a), len(a)
    
      write(*,*) trim(b)
      write(*,*) len_trim(b), len(b)
    
    end program char
    

    这会导致:

    ./a.out 
     John Doe
               8         100
     John Doe
               8           8
    

    【讨论】:

    • 我接受了High Performance Mark的回答,因为我认为它更有可能对以后的参考有所帮助。但我实际上在我的代码中使用了你的方法,因为a 确实被用作参数。
    【解决方案3】:

    不使用allocatable

    character(len=LEN_TRIM('John Doe') :: a = 'John Doe'
    

    如果担心重复,可以使用参数。

    当然,可分配字符变量有其用途,而且很可能适合您,但如果您真的希望变量通过各种赋值保持其长度,则必须小心:

    a(:) = 'J. Doe'
    

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 2017-09-06
      • 2021-09-12
      • 2012-06-06
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      相关资源
      最近更新 更多