2015-03-04 2 views
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 

Но это не сработало для меня. У кого-нибудь есть опыт с этим? Я думаю, что это можно сделать, но я не уверен, как это сделать.

+0

возможно дубликат [Fortran: самый большой и наименьшее целое] (http://stackoverflow.com/questions/9569756/fortran-the-largest-and-the-smallest -integer) – francescalus

+1

А также потенциально полезно: http://stackoverflow.com/q/25534202/. – francescalus

+0

Мой вопрос скорее о возможности определения динамического вида? Можете ли вы мне помочь? – DoubleDouble

ответ

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 
+0

Это отлично работает для меня !! Спасибо за Ваш ответ. – DoubleDouble