как отладить ошибку неправильного целого числа, хотя вход в порядке - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть код на Фортране, который я привел для чтения целых чисел из команды.Я определяю в коде, что эти входные параметры являются целыми числами, а также я дал целые числа в команде следующим образом: ./density -o data -s 1 -k 8 -b 20 Но это показало ошибку, что ошибка времени выполнения Fortran: Неверное целое число для элемента 1 вввод списка.Что не так с этим кодом?Пожалуйста, помогите мне!

integer s,b,k
if(option == "-o") then
    read(value,*) outputfile
else if(option == "-s") then
    read(value,*) s
else if(option == "-k") then
    read(value,*) k
else if(option == "-b") then
    read(value,*) b

1 Ответ

0 голосов
/ 21 сентября 2019

Вы всегда должны представлять минимально работающую программу, а не просто фрагмент исходного кода.В вашем коде неясно, как аргументы командной строки хранятся в «option» и «value».Рабочий пример может быть следующим:

program cmd_read
!
implicit none
!
integer, parameter :: MAXARG=8                   ! There are four pairs of arguments
character(len=1024), dimension(MAXARG)   :: args
character(len=2)   , dimension(MAXARG/2) :: options = (/'-o', '-s' , '-k', '-b' /)
character(len=1024)                      :: outputfile = ' '
integer :: iarg      ! number of arguments
integer :: i         ! dummy loop index
integer :: ios       ! io error status
integer :: s=0, k=0, b==   ! command line integer values, provide default values
!
args = ' '           ! ensure that they are blank
iarg = COMMAND_ARGUMENT_COUNT()   ! Get number of arguments
if(iarg >  0) then   ! Always keep in mind that there might be no arguments
   do i = 1, iarg
      call GET_COMMAND_ARGUMENT (i, args(i) )
   enddo
endif
!
do i= 1, iarg, 2      ! argument names are odd arguments
!                     ! Arguments might be in different sequence
   if(args(i)==options(1)) then      ! An alternative is the "CASE" construct
      outputfile = args(i+1)
   elseif(args(i)==options(2)) then
      read(args(i+1),*, iostat=ios) s
      if(ios/=0) then
         write(*,*) ' Error on -s'
      endif
   elseif(args(i)==options(3)) then
      read(args(i+1),*) k
   elseif(args(i)==options(4)) then
      read(args(i+1),*) b
   endif
enddo
write(*,'(a, i4, i4, i4)') outputfile(1:len_trim(outputfile)), s, k, b
!
end program cmd_read

Эта программа еще не проверяет, присутствуют ли аргументы командной строки, и находятся ли они в приемлемом числовом диапазоне.Проверка ошибок ввода / вывода для '-s' - это простой и грязный пример, чтобы перехватить такие вещи, как -s 1.8 или -s text

...