2010-12-14 73 views
-1

Tellement étrange. FORTRAN nécessite-t-il que les variables soient réinitialisées après leur envoi en tant que paramètres? J'ai continué à obtenir une erreur de segmentation chaque fois que j'envoyais les mêmes arguments à un autre sous-programme. J'ai découvert que les valeurs des arguments étaient effacées entre le premier appel et le second, sans aucune réaffectation des arguments entre les appels de fonction ou même dans les deux fonctions. La portée de ces arguments est limitée au programme principal (je n'utilise pas de blocs COMMON).FORTRAN efface les valeurs arg entre les appels de fonction?

Je ne peux pas afficher de code maintenant que j'écris de mon téléphone, mais avez-vous des idées? La solution de contournement temporaire consiste à réaffecter les valeurs juste avant d'appeler la deuxième fonction.

Merci pour l'aide.

+0

pas de code, pas de plaisir. –

+0

Je suis d'accord avec Stefano, il est impossible de savoir ce qui ne va pas sans voir le code. Est-ce que vous spécifiez l'intention de vos arguments? (Vous devriez l'être.) Quand vous écrivez que la portée des arguments est limitée au programme principal, mais que vous transmettez ces variables comme arguments aux sous-programmes, vous me confondez - si vous passez un argument à un sous-programme -programme sa portée est étendue, bien qu'il puisse sembler avoir un nom différent. –

+0

D'accord. La portée est étendue. Combinez cela avec appel par référence et un changement de valeur négligé dans le sous-programme, et vous avez une recette pour segfault. –

Répondre

4

Fortran transmet les arguments par référence, donc si vous les modifiez dans le premier sous-programme, ils seront modifiés dans l'appelant.

+0

Je ne pensais pas que je les modifiais dans les sous-programmes, mais en y regardant de plus près, j'ai constaté que j'étais. Merci pour l'aide. –

+0

Si vous le pouvez, spécifier 'intention (in)' dans la déclaration de variable dans la fonction peut aider le compilateur à vérifier si vous avez accidentellement assigné quelque chose que vous ne devriez pas faire. –

3

Non Fortran ne zappe pas les variables lorsqu'elles ont été utilisées comme arguments dans un appel de sous-programme. Cependant, les arguments transmis par référence peuvent avoir leurs valeurs modifiées par le sous-programme appelé. Essayez d'imprimer les variables avant le deuxième appel. Regardez comment le premier sous-programme utilise les paramètres.

Juste ma valeur de 0,02 $ - il ya des décennies que j'ai regardé Fortran (IV).

+0

Je ne sais pas pourquoi, mais chaque fois que je lis "Fortran Four", je me souviens de "Number Nine" (Pink Floyd). BTW Je me souviens encore du chargement des programmes FIV à partir d'une carte perforée. –

+0

J'ai encore des cartes perforées IBM 80 colonnes quelque part avec Fortran IV sur eux (si les rats de bibliothèque ne les ont pas réduits en poussière) - cue Monty Python Yorkshireman sketch. – RedGrittyBrick

+0

En effet, c'est par référence, comme l'a également souligné @lijie. J'ai oublié qu'ils étaient en train d'être changés. Merci à tous pour vos efforts! –