2016-12-21 2 views
1

J'ai un programme CERN qui calcule la fonction gamma d'un argument complexe, mais je ne peux pas exécuter le programme en raison d'un manque de connaissances Fortran.Une référence de fonction appelle un sous-programme

J'ai le programme suivant:

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 

et erreur apparaît

erreur # 6553: Une référence de fonction est l'appel d'un sous-programme de sous-programme. [CGAMMA]

+0

Qu'avez-vous? Un .exe, ou .so ou quoi? – Holmz

+0

C'est un .f90 j'ai ajouté le programme. –

+0

N'utilisez pas 'IMPLICIT' autre que' IMPLICIT NONE'. Regardez le code de sous-routine comment les variables doivent être définies. Vous demandez BEAUCOUP de problèmes en utilisant 'IMPLICIT REAL'. –

Répondre

1

Regardez le message d'erreur:

une référence de fonction invoque un sous-programme du sous-programme.

SUBROUTINE cgamma(mo, z, w) 
END SUBROUTINE 

définit cgamma en tant que (dans ce cas, externe) sous-routine.

Dans le programme

gama=cgamma(0,z,w) 

références cgamma en fonction (retourner un résultat à affecter à gama). C'est l'incompatibilité à laquelle le message d'erreur se réfère.

Pour résoudre ce problème, vous devez référencer le sous-programme avec une instruction call ou modifier cgamma comme une fonction, en retournant un résultat approprié. Compte tenu de la conception de la procédure (trois arguments), je suppose que la fonction est prévue.

+0

Merci, je juste besoin d'écrire: 'appeler cgamma' au lieu de ' gama = cgamma'. Merci pour votre aide –

1

techniquement ce n'est pas un programme. Je vais reposer une partie du document dans votre lien ci-dessous, notez le SUBROUTINE cgamma et END SUBROUTINE cgamma comme le très d'abord et très dernières lignes. Techniquement, ce fichier n'est pas un programme Fortran, il ne s'agit que d'un sous-programme qui fait partie d'un programme plus vaste.

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 

En Fortran les première et dernière lignes du fichier seraient PROGRAM whatever et END. Vous devrez donc soit obtenir le programme complet et utiliser celui qui appelle ce sous-programme cgamma, soit écrire votre propre fortran PROGRAM qui appelle alors ce sous-programme cgamma.

+0

Merci pour les conseils, je l'ai fait –