1

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

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

4

1 回答 1

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
于 2015-03-08T11:39:18.373 回答