Question

En Fortran, une nette différence existe entre la fonction et sous-programme: fonctions renvoient une valeur, des sous-routines retournent pas de valeur. Cette introduction d'une cascade de différences entre les deux. Un exemple est la sémantique d'appel. Vous pouvez appeler une fonction comme dans d'autres langues, mais pour appeler un sous-programme, vous devez faire une déclaration de call premier

Avec l'ajout de pointeurs et types de données dans fortran95, il semble qu'il n'y a pas de limitation technique à faire une fonction sous-programme, et de garder juste pour les sous-routines héritage. Les fonctions peuvent retourner à zéro (vous juste retour un entier fictif), une ou plusieurs valeurs (par exemple, on pourrait renvoyer un pointeur vers une instance affectée d'un type, comme un C ++ STL Pair).

Ai-je tort? Avons-nous besoin encore dans la programmation Fortran des sous-routines en raison d'une caractéristique qui ont des fonctions sous-routines ne fonctionnent pas?

Était-ce utile?

La solution

Si vous effectuez une recherche dans les archives comp.lang.fortran, vous trouverez des discussions sur la sémantique des fonctions. IIRC il se trouve que ce n'est pas clairement spécifié dans la norme ce qui est et ce ne sont pas autorisés pour les fonctions qui ont des effets secondaires.

Par exemple, le compilateur peut optimiser

x = foo (args) + foo (args)

dans

x = 2 * foo (args)

Ou pour un autre exemple, considérons

x = y + foo (y)

Et si foo () change la valeur de y? Rappelez-vous que Fortran ne pas le concept C de points de séquence.

En général, la recommandation faite par plusieurs experts est d'utiliser les fonctions que si elles sont pures, sinon utiliser des sous-routines. Et, c'est des conseils que je me suis aussi bien.

Autres conseils

Je ne pense pas que les sous-routines vont nulle part. La plupart des autres langues permettent des méthodes qui font et ne retournent pas de valeurs. Je ne vois aucune raison pour laquelle c'est une mauvaise chose. Personne ne devrait être déplacé pour changer une chose.

Legs dit que seul sous-routines persistera aussi longtemps que Fortran fait. Et aussi longtemps que Fortran est autour, il n'y aura rien de mal avec de l'écriture d'une méthode qui exécute un rien d'action et retourne.

Mise à jour:

Pourquoi dites-vous « tracas »? Quel est le problème? Je suis en désaccord avec l'idée que les sous-routines sont un « tracas » quand ils sont utilisés dans une situation appropriée.

Fortran a maintenu une distinction entre les fonctions et les sous-routines depuis la version 77 et probablement plus tôt. Autres langues C-famille font aussi. Pourquoi est-ce un coup tel tracas? Même les langues qui ont eu des pointeurs et des objets depuis longtemps ont des méthodes qui retournent vides.

Vous essayez de programme C en Fortran à nouveau, n'êtes-vous pas? ; -)

À mon avis, oui - nous. Car si pour une seule raison - ils sont plus faciles à saisir, à comprendre, et ils sont plus largement utilisés que les fonctions.

En outre, -1, car je crois que ce n'est pas une question constructive. Si vous ne le faites pas comme eux, alors ne les utilisez pas.

Si je comprends bien Stefano est pas contre l'idée de sous-routines. L'opinion contre eux est un non-sens. Il contre l'utilisation de différents styles pour les sous-routines / fonctions.

Fortran est le langage de programmation impératif. Plus précisément, il est un langage de programmation procédurale (et même plus précisément, il est structuré langage de programmation).

Dans la programmation impérative, nous avons un état et des déclarations pour le changer. Dans la programmation procédurale nos outils pour faire des changements des procédures (nous localisons des changements à l'intérieur des procédures). La procédure peut ou non retourner une valeur. Et je ne pense pas que ce fait (soit la valeur de retour de procédure ou non) est si importante raison d'avoir 2 entités différentes dans le langage de programmation. Nous ne pouvons avoir que des fonctions (comme en C) et juste retour quelque chose de spécial quand on ne fait pas besoin de quelque chose de retour (vide). Ou nous pouvons avoir que des procédures et une syntaxe spéciale permettant de renvoyer des valeurs comme dans Modula-2, Oberon, ...

La langue devrait probablement avoir qu'un seul style à déclarer des procédures. Je suis d'accord avec vous, Stefano.

Le fait que je dois me répondre à cette question est fou, mais comment cela est.

La différence vient du fait que vous ne pouvez pas « fonctions d'appel comme dans d'autres langues » en Fortran. Alors que dans C vous pouvez appeler une fonction entière sans affecter la valeur, par exemple

int foo() {
    return 5;
}
int main() {
    foo(); // this works
}

Dans Fortran, il faut toujours associer une variable de réception. Exemple

module test
   implicit none

contains
   integer function foo()
      print *, "hello"
      foo = 0
   end function

end module

program hello
   use test
   integer :: x

   x = foo() ! this works
   foo() ! this does not compile

end program hello

Ce qui signifie que pour « Emuler » une fonction vide en retournant un entier factice ne serait toujours pas vous permettre d'appeler sans avoir une variable de récepteur.

Dans Fortran, le type de retour de void n'existe pas. Techniquement, vous pouvez structurer votre programme avec toutes les fonctions, remplacer toutes les occurrences de l'instruction call avec x = comme vu ci-dessus, mais ce ne serait pas rendre votre syntaxe similaire à C ou d'autres langues de toute façon, où il n'y a pas de distinction entre les fonctions de vide-retour et non vides fonctions de retour. sous-routines sont les seules entités qui permettent de « retour vide », mais la sémantique pour effectuer l'appel est tout simplement différent. En dehors de cela, il n'y a pas de différence entre les deux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top