Ошибка времени выполнения в фортране - PullRequest
0 голосов
/ 28 октября 2011

Я на начальном уровне в Фортране.Недавно я попытался разработать простую программу для расчета перестановок и комбинаций.У него будет «меню», чтобы пользователь мог выбрать опцию для продолжения ...

      !/*-------MAIN PROGRAM STARTS-------*/
      !PURPOSE: TO CALCULATE COMBINATIONS AND PERMUTATIONS
      PROGRAM COMBINATION_PERMUTATION
      IMPLICIT NONE

      !DECLARATION OF VARIABLES
      REAL N, K, FACT, COMBINATION, PERMUTATION
      INTEGER CHOICE

      !CHOICE MENU
      CALL MENU

      !USER INPUT OF CHOICE
      READ(*,*) CHOICE

      !EXECUTION OF CODE BASED ON USER'S CHOICE
      SELECT CASE(CHOICE)
        CASE(1)
            !CALLS SUBROUTINE FOR COMBINATION 
            CALL COMBINATION_CALC (N, K, FACT, COMBINATION)            
        CASE(2)
            !CALLS SUBROUTINE FOR PERMUTATION
            CALL PERMUTATION_CALC (N, K, FACT, PERMUTATION)
        CASE(3)
            !EXITS THE PROGRAM
            STOP 
        CASE DEFAULT
        !INVALID CHOICE LEADS TO MENU BACK
        WRITE(*,*) 'INVALID CHOICE! PLEASE CHOOSE AN OPTION TO CONTINUE'
        CALL MENU
      END SELECT

      END PROGRAM COMBINATION_PERMUTATION
      !/*-------MAIN PROGRAM ENDS-------*/


      !/*-------SUB PROGRAMS START-------*/
      !FUNCTION FOR FACTORIAL
      FUNCTION FACT(N)
      IMPLICIT NONE
      REAL FACT, N
      INTEGER P, I
      P=1
      DO I=1, N
        P=P*I
      END DO
      FACT=P
      RETURN
      END FUNCTION 

      !SUBROUTINE FOR MENU
      SUBROUTINE MENU
      IMPLICIT NONE
      WRITE(*,*) ' CHOOSE AN OPTION TO CONTINUE.. '
      WRITE(*,*) ' 1. COMBINATION '
      WRITE(*,*) ' 2. PERMUTATION '
      WRITE(*,*) ' 3. EXIT PROGRAM '
      RETURN
      END SUBROUTINE MENU

      !SUBROUTINE FOR COMBINATION
      SUBROUTINE COMBINATION_CALC (N, K, FACT, COMBINATION)
      IMPLICIT NONE

      REAL N, K, FACT, COMBINATION

      WRITE(*,*) ' WHAT IS THE VALUE OF N? '
      READ(*,*) N

2     WRITE(*,*) ' WHAT IS THE VALUE OF K? '
      READ(*,*) K

      IF (K<0) THEN 
            WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE MORE THAN 0! '
            GO TO 2
        ELSE IF (K>N)THEN
            WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE LESS THAN N! '
            GO TO 2
        ELSE
      END IF 

      COMBINATION=FACT(N)/(FACT(N-K)*FACT(N))
      WRITE(*,*) ' HENCE, THERE ARE ', COMBINATION, ' WAYS TO ARRANGE. '
      CALL MENU
      RETURN
      END SUBROUTINE COMBINATION_CALC

      !SUBROUTINE FOR PERMUTATION
      SUBROUTINE PERMUTATION_CALC (N, K, FACT, PERMUTATION)
      IMPLICIT NONE

      REAL N, K, FACT, PERMUTATION

      WRITE(*,*) ' WHAT IS THE VALUE OF N? '
      READ(*,*) N

3     WRITE(*,*) ' WHAT IS THE VALUE OF K? '
      READ(*,*) K

      IF (K<0) THEN 
            WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE MORE THAN 0! '
            GO TO 3
        ELSE IF (K>N) THEN
            WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE LESS THAN N! '
            GO TO 3
        ELSE
      END IF

      PERMUTATION=FACT(N)/FACT(N-K)
      WRITE(*,*) ' HENCE THERE ARE', PERMUTATION,' WAYS TO ARRANGE. '
      CALL MENU      
      RETURN
      END SUBROUTINE PERMUTATION_CALC
      !/*-------SUB PROGRAMS END-------*/

И я получаю ошибку во время выполнения всякий раз, когда я ввожу ввод 1 или 2, чтобы выбрать случай для продолжения....

Ошибка отображается во всплывающем окне следующим образом: -


RUN TIME ERROR

Попытка вызова подпрограммы с аргументом номер трикак реальное (kind = 1), когда требуется процедура.

COMBINATION_CALC- в файле комбинацииpermutation.for в строке 62 [+0068] main- в файле комбинацииpermutation.for в строке 23 [+ 00e2]


Насколько я знаю, аргумент номер три в COMBINATION_CALC - это "FACT", который является функцией для вычисления факториала.Я не могу понять ошибку.Пожалуйста, ведите меня.Заранее спасибо ..


ОБНОВЛЕНИЕ

Я исправил ОШИБКУ ВРЕМЕНИ, используя исправление, данное yosukesabai ... Моя программа завершена..но, INTEGER OVERFLOW это новая проблема для меня.Я изменил объявление REAL на INTEGER (KIND = 4) .. Когда значение N и значение K больше 12 ... итоговый ответ для комбинации и перестановки будет большим ... Могу ли я узнать, как это исправить?

Вот новый код для моей программы ...

          !/*-------MAIN PROGRAM STARTS-------*/
      !PURPOSE: TO CALCULATE COMBINATIONS AND PERMUTATIONS
      !CREATED BY: RETHNARAJ RAMBABU
      !DATE: 28/10/2011
      PROGRAM COMBINATION_PERMUTATION
      IMPLICIT NONE

      !DECLARATION OF VARIABLES
      INTEGER CHOICE, N, K
      INTEGER(KIND=4) COMBINATION, PERMUTATION
      INTEGER, external :: FACT

      !CHOICE MENU
1     WRITE(*,*) ' CHOOSE AN OPTION TO CONTINUE.. '
      WRITE(*,*) ' 1. COMBINATION '
      WRITE(*,*) ' 2. PERMUTATION '
      WRITE(*,*) ' 3. EXIT PROGRAM '

      !USER INPUT OF CHOICE
      READ(*,*) CHOICE

      !EXECUTION OF CODE BASED ON USER'S CHOICE
      SELECT CASE(CHOICE)
        CASE(1)
            !CALLS SUBROUTINE FOR COMBINATION 
            CALL COMBINATION_CALC (N, K, FACT, COMBINATION)  
            GO TO 1          
        CASE(2)
            !CALLS SUBROUTINE FOR PERMUTATION
            CALL PERMUTATION_CALC (N, K, FACT, PERMUTATION)
            GO TO 1
        CASE(3)
            !EXITS THE PROGRAM
            STOP 
        CASE DEFAULT
        !INVALID CHOICE LEADS TO MENU BACK
        WRITE(*,*) 'INVALID CHOICE! PLEASE CHOOSE AN OPTION TO CONTINUE'
        GO TO 1
      END SELECT

      END PROGRAM COMBINATION_PERMUTATION
      !/*-------MAIN PROGRAM ENDS-------*/


      !/*-------SUB PROGRAMS START-------*/
      !FUNCTION FOR FACTORIAL
      FUNCTION FACT(N)
      IMPLICIT NONE
      INTEGER N, P, I, FACT
      P=1
      DO I=1, N
        P=P*I
      END DO
      FACT=P
      RETURN
      END FUNCTION 

      !SUBROUTINE FOR COMBINATION
      SUBROUTINE COMBINATION_CALC (N, K, FACT, COMBINATION)
      IMPLICIT NONE

      INTEGER N, K, FACT
      INTEGER(KIND=4) COMBINATION

      WRITE(*,*) ' WHAT IS THE VALUE OF N? '
      READ(*,*) N

2     WRITE(*,*) ' WHAT IS THE VALUE OF K? '
      READ(*,*) K

      IF (K<0) THEN 
            WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE MORE THAN 0! '
            GO TO 2
        ELSE IF (K>N)THEN
            WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE LESS THAN N! '
            GO TO 2
        ELSE
      END IF 

      COMBINATION=FACT(N)/(FACT(N-K)*FACT(K))
      WRITE(*,*) ' HENCE, THERE ARE ', COMBINATION, ' WAYS TO ARRANGE. '
      RETURN
      END SUBROUTINE COMBINATION_CALC

      !SUBROUTINE FOR PERMUTATION
      SUBROUTINE PERMUTATION_CALC (N, K, FACT, PERMUTATION)
      IMPLICIT NONE

      INTEGER N, K, FACT
      INTEGER(KIND=4)PERMUTATION

      WRITE(*,*) ' WHAT IS THE VALUE OF N? '
      READ(*,*) N

3     WRITE(*,*) ' WHAT IS THE VALUE OF K? '
      READ(*,*) K

      IF (K<0) THEN 
            WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE MORE THAN 0! '
            GO TO 3
        ELSE IF (K>N) THEN
            WRITE(*,*) ' ERROR! VALUE OF K SHOULD BE LESS THAN N! '
            GO TO 3
        ELSE
      END IF

      PERMUTATION=FACT(N)/FACT(N-K)
      WRITE(*,*) ' HENCE THERE ARE', PERMUTATION,' WAYS TO ARRANGE. '
      RETURN
      END SUBROUTINE PERMUTATION_CALC
      !/*-------SUB PROGRAMS END-------*/

Ответы [ 2 ]

0 голосов
/ 28 октября 2011

О переполнении INTEGER объявите переменную P (внутри функции FACT) REAL вместо INTEGER. Переменная INTEGER (4) не может превышать 2^31 и 12! < 2^31 < 13!

Но будьте осторожны: переполнение может произойти и со значением REAL (на моем компьютере 35!: 34!=2.9523282E+38). С ДВОЙНОЙ ТОЧНОСТЬЮ (REAL (8)) переполнение происходит при 171! (170! = 7.2574156153+306)

0 голосов
/ 28 октября 2011

В верхней части вашего кода,

  PROGRAM COMBINATION_PERMUTATION
  IMPLICIT NONE

  !DECLARATION OF VARIABLES
  REAL N, K, FACT, COMBINATION, PERMUTATION
  INTEGER CHOICE

Здесь вы сказали, что FACT является реальным, поэтому fortran предполагает, что это реальная переменная. Но вы имели в виду, что это ссылка на функцию, которую вы определили в том же файле. Так что пересмотрите как

  !DECLARATION OF VARIABLES
  REAL N, K, COMBINATION, PERMUTATION
  INTEGER CHOICE
  REAL, external :: FACT

external - это способ сказать, что это функция, которую вы определили где-то вне программного блока (программы, подпрограммы или функции)


(игнорируйте ниже, если вам все равно)

Я заметил, что нет смысла передавать ссылку на функцию. так что вы можете прекратить передавать функцию и просто вызывать ее прямо из подпрограммы сочетание_кальций. в этом случае n, k, комбинация - это три аргумента для подпрограммы, а внутри сочетание_кала вы получите real, external :: fact.

...