Я пишу программу на Fortran 95 (для компиляции с помощью gfortran), содержащую подпрограмму, выполняющую определенные вычисления. Как было предложено в "Fortran 95/2003 для ученых и инженеров" SJ Chapman, я пытаюсь остановить подпрограмму при обнаружении ошибки и "выбросить"[1] флаг ошибки, который "поймать "ed[1] вызывающей программой, которая выполнит все необходимые действия. В идеале я собираюсь сделать что-то вроде:
! Pseudo-code
PROGRAM my_prog
integer :: error_flag
CALL my_subr (<input_args>, <output_args>, error_flag)
! Also error_flag is an output: 0 -> everything OK, 1 -> error
IF (error_flag /= 0) THEN
WRITE (*,*) 'Error during execution of "my_subr"'
ELSE
... do something ...
END IF
END PROGRAM my_prog
Как остановить подпрограмму и корректно обработать ошибки?
Вот пример: «деление» subroutine
принимает целочисленное входное значение и итеративно делит его на значение, которое представляет собой входное значение, уменьшенное на число шагов-1. Когда такое значение достигает нуля, следует поднять флаг и выйти из подпрограммы, не выполняя деление на ноль.
SUBROUTINE division (inval, outval, error_flag)
IMPLICIT NONE
INTEGER, INTENT(IN) :: inval
REAL, INTENT(OUT) :: outval
INTEGER, INTENT(OUT) :: error_flag ! 0 -> OK, 1 -> error
INTEGER :: i
REAL :: x
error_flag = 0
x = REAL(inval)
DO i = 0, 10
IF (inval-i == 0) error_flag = 1
! How can I gracefully exit now?
x = x / REAL(inval-i)
END DO
END SUBROUTINE division
PROGRAM my_prog
IMPLICIT NONE
REAL :: outval
INTEGER :: error_flag
CALL division (8, outval, error_flag)
IF (error_flag == 1) THEN
WRITE (*,*) 'Division by zero'
ELSE
WRITE (*,*) 'Output value:', outval
END IF
END PROGRAM my_prog
Примечания:
[1] Я заимствую (вероятно неуместным образом) жаргон C++.
subroutine
: скажем, у меня есть цикл, и я сталкиваюсь с делением на ноль. Я хотел бы поднять флаг до выполнения деления, не для выполнения деления и немедленного выхода из подпрограммы. Как я могу это сделать? - person Pier Paolo   schedule 07.08.2015return
, если хотите). - person Pier Paolo   schedule 07.08.2015