2016-12-21 15 views
1

У меня есть программа CERN, которая вычисляет гамма-функцию сложного аргумента, но я не могу запустить программу из-за отсутствия знаний Fortran.Ссылка на функцию вызывает подпрограмму

У меня есть следующие программы:

PROGRAM Console1 
    IMPLICIT REAL *8 (A-H,O-Z) 
    COMPLEX *16 gama,z,w 
    z=cmplx(0,0.707106781186548d0) 
    gama=cgamma(0,z,w) 
END 

SUBROUTINE cgamma(mo, z, w) 
    INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(14, 60) 
    INTEGER, INTENT(IN)  :: mo 
    COMPLEX (dp), INTENT(IN) :: z 
    COMPLEX (dp), INTENT(OUT) :: w 
... the subroutine code here 
END SUBROUTINE cgamma 

, а затем ошибка появляется

ошибка # 6553: Ссылка функции вызова подпрограммы подпрограммы. [CGAMMA]

+0

Что у вас? A .exe, или .so или что? – Holmz

+0

Это .f90 Я добавил программу. –

+0

Не используйте 'IMPLICIT' другое' IMPLICIT NONE'. Посмотрите на код подпрограммы, как переменные должны быть определены. Вы запрашиваете много проблем, используя 'IMPLICIT REAL'. –

ответ

1

Посмотрите на сообщение об ошибке:

Функция ссылки вызова подпрограмму подпрограммы.

SUBROUTINE cgamma(mo, z, w) 
END SUBROUTINE 

определяет cgamma как (в этом случае внешние) подпрограммы.

В программе

gama=cgamma(0,z,w) 

ссылки cgamma как функция (возвращает результат, который будет назначен gama). Это несовместимость, к которой относится сообщение об ошибке.

Для решения этой проблемы вам необходимо обратиться к подпрограмме с помощью инструкции call или изменить функцию cgamma как возвращающую соответствующий результат.

Учитывая конструкцию процедуры (три аргумента), я ожидаю, что функция предназначена.

+0

Спасибо, мне просто нужно было написать: 'call cgamma' вместо ' gama = cgamma'. Спасибо за помощь –

1

технически это не программа. Я отправлю часть документа по вашей ссылке ниже, обратите внимание на SUBROUTINE cgamma и END SUBROUTINE cgamma как на самое последнее и очень последние строк. Технически этот файл не является программой fortran, это только подпрограмма, которая является частью более крупной программы.

SUBROUTINE cgamma(mo, z, w) 

    IMPLICIT NONE 

! variables and code not worth posting to illustrate what is happening 

    60 w = CMPLX(w1, w2, KIND=dp) 
    RETURN 

    70 w = (0.0_dp, 0.0_dp) 
    RETURN 

    CONTAINS 

    FUNCTION rexp(x) RESULT(fn_val) 
!  extra code here, do not need to post it 
     fn_val = -1.0_dp 
     RETURN 
    END FUNCTION rexp 

END SUBROUTINE cgamma 

В фортраном первые и последние строки файла будет PROGRAM whatever и END.

+0

Спасибо за совет, я сделал это –