2016-05-02 1 views
0

J'ai un sous-programme Fortran qui attend un ensemble complexe commePasser un vrai tableau si un ensemble complexe devrait

subroutine foo(cnumbers, n) 
    integer :: n 
    complex :: cnumbers(n) 
    ... 
end subroutine foo 

et plus tard, je veux l'appeler comme

real :: rnumbers(40) 
... 
call foo(rnumbers, 20) 

Cependant, je reçois l'erreur du compilateur:

error #6633: The type of the actual argument differs from the type of the dummy argument.

Bien sûr, cela est compréhensible car un tableau réel n'est pas un ensemble complexe. Mais il doit y avoir un moyen de le faire fonctionner.

Parce que si le sous-programme foo et l'appel de foo sont différents modules et sont écrits dans différents fichiers Fortran, le compilateur ne pas se plaindre, et tout fonctionne très bien.

Est-ce que quelqu'un sait comment le faire fonctionner? Comment passer un tableau réel si un tableau complexe est attendu?

+0

Vous devriez afficher plus de code du côté appelant. Si 'rnumbers' n'est pas un argument fictif, vous pouvez simplement l'équivalencer avec un tableau complexe. –

+0

Non, 'rnumbers' n'est pas dummy, c'est une variable réelle que je crée avec' real :: rnumbers (40) '. En passant, j'utilise le compilateur Intel Fortran 15.0.3. – thyme

+0

si votre sous-programme était externe (aucune interface explicite) votre compilateur ne détecterait pas le problème de type et cela fonctionnerait bien. – agentp

Répondre

2

Vous pouvez utiliser transfer(rnumbers, ...) pour convertir le type (un tableau temporaire est susceptible d'être créé) ou utiliser l'équivalence pour éviter

real :: rnumbers(40) 
    complex :: cnumbers(20) 
    equivalence (rnumbers, cnumbers) 

    set the value of rnumbers 

    call foo(cnumbers, 20) 

Si vous avez besoin des tableaux affectables l'équivalence ne fonctionnera pas.

Vous pouvez également utiliser un sous-programme externe et placer le compilateur sur l'interface et simplement passer le tableau réel au lieu du complexe. Ce n'est pas conforme aux normes, mais il est parfois utilisé. Voir aussi Gfortran complex actual to real dummy argument

+0

Merci pour la réponse. Mais malheureusement, je traite des tableaux allouables. Est-ce qu'il n'y a pas de solution de contournement avec des pointeurs? Je pense que la solution avec 'transfer' est trop chère quand il s'agit de très grands tableaux. – thyme

+0

@thyme ** C'est exactement pourquoi j'ai demandé que vous ajoutiez plus de code d'appel! ** Pourquoi vous ne pouvez tout simplement pas faire cela? J'ai en quelque sorte supposé que le code que vous avez posté est incomplet et ajouté l'avertissement ... La seule chose que vous avez faite c'est que vous venez de répondre "rnumbers n'est pas dummy, c'est une variable réelle que je crée avec real :: rnumbers (40)" même si ce n'est pas du tout vrai ... –

+0

Ok, désolé, j'étais trop naïf. J'ai pensé à rendre l'exemple aussi simple que possible ... – thyme