2016-07-18 5 views
0

Je veux créer une fonction FUN(x) qui prend x comme argument qui est une variable complexe, mais je ne l'ai pas fait. J'ai cherché mais je n'ai trouvé aucune information utile. Quelqu'un peut-il m'aider?Fonction variable complexe

program Console2 

IMPLICIT REAL *8 (A-H,O-W) 
external FUN 
complex:: b 

b=(2,2) 

print*,FUN(b) 

end program Console2 

    FUNCTION FUN (x)  
    IMPLICIT REAL *8 (A-H,O-W) 
    complex, intent(in) :: x 
    complex :: a 
    a=(1,2) 

    FUN=x+a 
    RETURN 

END 
+0

Votre problème est-il que le résultat est réel (comme vous l'avez implicitement déclaré), ou autre chose? – francescalus

+0

La sortie est juste un nombre réel, une partie complexe est manquante. –

+1

Si vous voulez que 'fun' soit complexe, vous devez le déclarer complexe, plutôt que' real * 8'. Mettez du «plaisir complexe» à la fois dans votre programme principal et dans la fonction. – francescalus

Répondre

3

Depuis le typage implicite est pas la réponse, voici quelque chose d'un peu plus de bonne Fortran ...

program console2 

    use, intrinsic :: iso_fortran_env 
    ! this module defines portable kind type parameters incl real64 

    implicit none 
    ! so no errors arising from forgotten declarations or misunderstood 
    ! implicit declarations 

    complex(kind=real64):: b 
    ! for a complex number each part will have the same size as a real64 
    ! no trying to figure out complex*8 or complex*16 

    b=(2,2) 

    print*,fun(b) 

contains 
    ! by 'containing' the function definition we get the compiler to check 
    ! its interface at compile time; properly called *host-association* and in 
    ! a larger program we might use a module instead 

    complex(kind=real64) function fun (x)  
    complex(kind=real64), intent(in) :: x 
    complex(kind=real64) :: a 

    a=(1,2) 
    fun=x+a 

    end function fun 

end program console2 
0

Tout d'abord, éviter de taper implicite. Voici ce que j'ai travaillé. Détails seront ajoutés plus tard:

program Console2 

    ! good programming practice 
    IMPLICIT NONE 
    external FUN 
    complex:: b 
    complex:: FUN                                

    b=(2,2) 

    print*,FUN(b) 
    end program Console2 

    COMPLEX FUNCTION FUN (x) 
    IMPLICIT NONE 
    complex, intent(in) :: x 
    complex :: a 
    a=(1.0,2.0) ! a=(1,2) 

    FUN=x+a 
    RETURN 
    END 

On devrait également utiliser le paramètre KIND. Je vais améliorer cela plus tard avec de meilleures pratiques et une explication plus longue. Mais pour l'instant, la vérification ci-dessus devrait vous expliquer votre erreur. High Performance Mark vient de mettre à jour la réponse plus l'explication.