Fortran动态类整数

时间:2015-03-04 14:43:00

标签: dynamic integer fortran fortran90 data-kinds

我想编写一段代码,可以找到我机器的所有可用整数种类,并打印所有这些代码的范围。 找到种类不是困难的部分,使用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

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

1 个答案:

答案 0 :(得分: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