2010-12-12 3 views
1

Lorsque je crée un scalaire INTEGER, s, et que je le passe à un sous-programme, sa valeur est convertie en float et est horriblement inexacte. Par exemple, si je mets s = 2 et CALL print_my_int (s) où il écrira (,) à la console, sa valeur apparaît comme 2.80259693E-45. Les autres entiers scalaires se comportent de la même manière, sauf dans le cas où s = 0, auquel cas la sortie est 0.0000000. Mais même cela est toujours faux, car un entier ne devrait évidemment pas afficher une décimale et une mantisse. Ce n'est pas un problème de format de sortie, car je peux obtenir d'autres entiers à afficher correctement lorsqu'il est affiché localement.Aide! Le passage d'entiers FORTRAN les transforme en flotteurs inexacts?

Une idée de ce qui se passe ici? Ai-je besoin de forcer le type de données d'argument dans la définition de sous-routine? Est-ce faisable?

Exemple de code:

PROGRAM print_int 
    INTEGER s 
    s = 2 
    CALL print_my_int(s) 
END PROGRAM print_int 

SUBROUTINE print_my_int(x) 
    WRITE(*,*) x 
END SUBROUTINE print_my_int 

résultante Sortie:

2.80259693E-45 

Répondre

1

Bon, après prématuré, mais je vais laisser à tous ceux qui se jette dans la même. Je ne suis pas habitué à la syntaxe pour appliquer les types de paramètres dans FORTRAN. Dans la définition de la sous-routine, le type de données du paramètre est inférieur au nom et à la liste des paramètres. S'il n'est pas inclus, le compilateur GNU ne prévient pas ou ne crie pas. J'imagine que c'est un autre type par défaut. Donc, mon exemple ci-dessus devrait se lire comme ça ...

PROGRAM print_int 
    INTEGER s 
    s = 2 
    CALL print_my_int(s) 
END PROGRAM print_int 

SUBROUTINE print_my_int(x) 
    INTEGER x 
    WRITE(*,*) x 
END SUBROUTINE print_my_int 
+1

Cela aurait également fonctionné si vous avez changé le nom du paramètre de 'x' à' i' ou 'j', car FORTRAN a une inférence de type basée sur les caractères initiaux des noms de variables. Mais ne fais pas ça - c'est une mauvaise pratique. – JasonFruit

+0

Merci, monsieur. Un conseil pratique, mais je ferai attention à éviter les mauvaises pratiques. –

+3

Il est bon d'utiliser l'instruction "implicite none" au début de chaque programme/sous-programme si vous voulez que le compilateur s'établisse sur des variables non déclarées. – steabert

2

rien de nouveau, je voulais juste souligner l'utilisation d'une interface en fournissant un code qui ne correspondait pas à un commentaire:

comme il est dit que vous pouvez mettre implicit none partout au début de la section de déclaration, ou bien vous pouvez mettre une interface dans votre programme qui utilise le sous-programme, le compilateur jeter une erreur d'incompatibilité de type:

PROGRAM print_int 
INTERFACE 
    SUBROUTINE print_my_int(x) 
    END SUBROUTINE 
END INTERFACE 
INTEGER s 
s = 2 
CALL print_my_int(s) 
END PROGRAM print_int 

SUBROUTINE print_my_int(x) 
WRITE(*,*) x 
END SUBROUTINE print_my_int 
3

un autre commentaire étendu , plus simple encore que @steabert s »:

PROGRAM print_int 
    INTEGER s 
    s = 2 
    CALL print_my_int(s) 

CONTAINS 

SUBROUTINE print_my_int(x) 
    WRITE(*,*) x 
END SUBROUTINE print_my_int 

END PROGRAM print_int 

En contenant le sous-programme dans le programme que vous le compilateur en contraindre, faire une interface explicite, l'enregistrement 3 lignes de code. En laissant implicite la déclaration de x dans le sous-programme, le compilateur repère l'erreur.

Questions connexes