2010-09-30 18 views
18

Je crois savoir que vous pouvez retourner un tableau d'une fonction dans Fortran, mais pour une raison quelconque, mon code ne renvoie que la première valeur du tableau que je lui demande de retourner. Ceci est la fonction:Fonction Renvoyer un tableau dans Fortran

function polynomialMult(npts,x,y) 
    integer npts 
    double precision x(npts), results(npts + 1), y(npts,npts) 

    polynomialMult = x(1:npts) + 1 

end function 

et c'est là je l'appeler

C(1:numPoints) = polynomialMult(numPoints,x,f) 

print *, C(1:numPoints)` 

en ce moment, il ne fait pas quelque chose d'utile parce que je suis en train de comprendre la syntaxe avant d'écrire la logique . J'ai vu des choses sur la spécification des types pour les fonctions, mais quand j'écris

integer function polynomialMult(npts,x,y) 

ou tout ce que je reçois une erreur de compilation.

Répondre

25

Pour définir une fonction qui retourne un tableau comprennent la déclaration de fonction à l'intérieur de la fonction, comme ceci:

function polynomialMult(npts,x,y) 
    integer npts 
    double precision x(npts), results(npts + 1), y(npts,npts) 

! Change the next line to whatever you want 
    double precision, dimension(npts) :: polynomialMult 

    polynomialMult = x(1:npts) + 1 

end function 

Votre déclaration

integer function polynomialMult(npts,x,y) 

déclare que la fonction retourne un entier. Un entier, pas un tableau d'entiers. Je ne pense pas que la norme permet des déclarations de fonctions telles que:

integer, dimension(10) function polynomialMult(npts,x,y) 

mais je peux me tromper. J'utilise toujours le formulaire que je t'ai montré ci-dessus.

Si vous avez un compilateur Fortran à jour, vous pouvez faire des choses intelligentes telles que retourner un tableau alloué. Et je vous suggère de comprendre la syntaxe du tableau. Par exemple, votre déclaration:

polynomialMult = x(1:npts) + 1 

pourrait de façon plus concise écrire:

polynomialMult = x + 1 

depuis Fortran tracera l'addition scalaire à tous les éléments du tableau x que vous avez déclaré avoir seulement npts éléments. Passer les tailles de tableaux dans des sous-programmes est très FORTRAN77 et presque toujours inutile maintenant. Généralement, soit vous voulez opérer sur chaque élément d'un tableau (comme dans l'exemple de la syntaxe du tableau), soit vous laissez le sous-programme déterminer la taille du tableau auquel il est confronté.

+1

Merci pour votre aide. Comme vous pouvez probablement le dire, je suis nouveau à fortran. – Statler

3

Je suis d'accord avec le répondeur précédent que les travaux suivants:

polynomialMult = x + 1 

Cependant, sans savoir que polynomialMult et x sont des tableaux, on peut supposer qu'il est une opération scalaire. Je préfère être évident et de le faire de cette façon:

polynomialMult(:) = x(:) + 1 

J'ai même insisté sur le fait que les codeurs de mon groupe le font de cette façon. Je n'aime pas travailler dur pour comprendre le code de quelqu'un - je veux qu'il soit évident ce qu'ils font.

+2

Haha, retourné à cette question quand il a eu un autre vote.Il y a un «problème» subtil avec cette réponse: 'polynomialMult' est un tableau et' polynomialMult (:) 'est une section de tableau et les deux ne sont pas toujours interchangeables, bien qu'ils soient ici. –

+0

@HighPerformanceMark: Je dirais quelque chose comme 'polynomialMult (1: npts) = x (1: npts) + 1'. Ensuite, il n'y a aucun doute, non? – jvriesem

+1

@jvriesem, cela dépend de la façon dont les indices de 'polynomialMult' sont définis. Parfois, il existe de bonnes raisons d'utiliser des index non standard tels que 'polynomialMult double precision (0: npts-1)'. Dans ce cas, vous risquez de rencontrer des bogues avec 'polynomialMult (0: npts-1) = x (0: npts-1) + 1', car vous risquez de fausser les index de l'expression. – astay13

Questions connexes