【问题标题】:Fortran dynamic kind of integerFortran 动态整数类型
【发布时间】:2015-05-05 14:37:38
【问题描述】:

我想编写一段代码,它可以找到我机器的所有可用整数类型并打印所有它们的范围。 找到种类并不是困难的部分,使用 selected_int_kind 我能够遍历所有可用的种类编号,直到我得到一个 -1 值,表明编译器不再可以表示整数。

这个过程产生了一个可用种类编号的数组,例如(/ 1 2 4 8 16/)(这是我的 gfortran 编译器的结果)

下一步是使用这个数组定义 5 种不同的整数,并询问最大可表示的整数是多少。 我的想法是使用一个可分配的整数,并且每次都使用其他类型的参数来分配它,比如

program main
integer,allocatable :: i
integer::j
integer,dimension(:)::nb_kind
call give_me_the_kinds(nb_kind)
for j=1,size(nb_kind)
    allocate(i,kind=nb_kind(j))
    print *,huge(i)
    deallocate(i)
end program

但这对我来说并不奏效。有没有人有这方面的经验?我认为可以做到,但我不知道该怎么做。

【问题讨论】:

  • 还有可能有用:stackoverflow.com/q/25534202
  • 我的问题更多是关于定义动态类型的可能性吗?你能帮我解决这个问题吗?
  • 你不能让 kind-type 参数是动态的。也许我的第二个链接中的 hacky 答案可能是您想要的(因此这是一个更好的副本)?。
  • 作为另一个评论,不值得回答:也考虑来自内部模块iso_fortran_env的数组integer_kinds

标签: dynamic integer fortran fortran90 data-kinds


【解决方案1】:

在 Fortran 中,动态类型变量(直接从种类号到变量)是不可能的。种类数必须是编译时常量。你可以这样做:

program main
  use iso_fortran_env, only : integer_kinds
  implicit none
  integer :: i
  open(20,file="mykinds.f90",status="unknown",action="write")
  write (20,'(A/A)') 'program main','  implicit none'
  do i=1, size(integer_kinds)
     write (20,'(A,I0,A,I0,A)') '  integer(kind=',integer_kinds(i),') :: i',i
  end do

  do i=1, size(integer_kinds)
     write (20,'(A,I0,A,I0,A)') '  write (*,"(A,I0)") "integer(kind=',&
          & integer_kinds(i),') huge = ", huge(i',i,')'
  end do

  write (20,'(A)') 'end'
  close(20)
  call execute_command_line ("gfortran mykinds.f90 && ./a.out")
end program main

【讨论】:

  • 这对我来说完美!感谢您的回答。
猜你喜欢
  • 2014-10-05
  • 1970-01-01
  • 2019-06-21
  • 2020-02-17
  • 1970-01-01
  • 2011-01-19
  • 2011-03-11
  • 1970-01-01
  • 2017-05-17
相关资源
最近更新 更多