2010-07-03 16 views
41

J'essaie d'apprendre Fortran et je vois beaucoup de définitions différentes qui circulent et je me demande si elles essaient accomplir la même chose. Quelle est la différence entre ce qui suit?Fortran: entier * 4 vs entier (4) vs entier (type = 4)

  • integer*4
  • integer(4)
  • integer(kind=4)

Répondre

42

Dans Fortran> = 90, la meilleure approche est d'utiliser les fonctions intrinsèques pour spécifier la précision dont vous avez besoin - ce qui garantit à la fois la portabilité et que vous obtenez la précision dont vous avez besoin. Par exemple, pour obtenir des entiers i et my_int qui soutiendra au moins 8 chiffres décimaux, vous pouvez utiliser:

integer, parameter :: RegInt_K = selected_int_kind (8) 
integer (kind=RegInt_K) :: i, my_int 

Après avoir défini « RegInt_K » (ou quel que soit le nom que vous sélectionnez) comme paramètre, vous pouvez l'utiliser tout au long votre code comme un symbole. Cela facilite également la modification de la précision.

Demander 8 ou 9 chiffres décimaux obtiendra généralement un entier de 4 octets.

entier * 4 est une extension courante qui retourne à l'ancien FORTRAN pour spécifier un entier de 4 octets.

nombre entier (4) ou nombre entier (RegInt_K) sont des nombres entiers (type = 4) ou des nombres entiers (type = RegInt_K). integer (4) n'est pas le même que integer * 4 et n'est pas portable - la norme de langage ne spécifie pas les valeurs numériques des genres. La plupart des compilateurs utilisent le type = 4 pour les entiers de 4 octets - pour ces compilateurs entier * 4 et entier (4) fournira le même type entier - mais il y a des exceptions, donc entier (4) est non portable et mieux évité .

L'approche pour les réels est similaire. MISE À JOUR: si vous ne voulez pas spécifier les types numériques avec la précision requise, mais plutôt avec le stockage qu'ils utiliseront, Fortran 2008 fournit une méthode. réels et les entiers peuvent être spécifiés par le nombre de bits de stockage après use ing le module ISO_FORTRAN_ENV, par exemple, pour un nombre entier de 4 octets (32 bits):

use ISO_FORTRAN_ENV 
integer (int32) :: MyInt 

Le mode d'gfortran a documentation sous « intrinsèque modules".

+0

c'était une explication fabuleuse! étourdissant! excellent! c'est clair pour moi maintenant ..: D merci beaucoup! – Sam

19

Juste une explication plus explicite de ce genre. Le compilateur a une table de types numériques différents. Tous les types entiers sont différents types du type de base - integer. Disons que le compilateur a des types 1 octet, 2 octets, 4 octets, 8 octets et 16 octets integer (ou real). Dans la table le compilateur a un index pour chacun de ce genre - cet index est le numéro de type.

De nombreux compilateurs choisissent cette numérotation:

kind number number of bytes 
1    1 
2    2 
4    4 
8    8 
16    16 

Mais ils peuvent choisir une autre numérotation. Une des possibilités évidentes est

kind number number of bytes 
1    1 
2    2 
3    4 
4    8 
5    16 

Il existe en effet des compilateurs (au moins g77 et NAG) qui choisissent cette approche. Il y a aussi des options pour changer cela.Par conséquent, les numéros kind ne sont pas portables. integer(kind=4) ou integer(4) signifie un entier de 4 octets ou un entier de 8 octets selon le compilateur.

integer*4 est portable dans le sens où il signifie toujours 4 octets. Mais d'un autre côté, ce n'est pas portable car il n'a jamais fait partie d'aucune norme. Les programmes utilisant cette notation ne sont pas valables Fortran 77, 90 ou tout autre Fortran.

Pour voir les bonnes options comment régler les nombres de caractères, voir la réponse de M.S.B.

Le même concept s'applique aux types de données real. Voir Fortran 90 kind parameter (la réponse du mataap).

+1

Ce qui est intéressant ici, c'est que les types de caractères (type) et type * ne sont pas entièrement interchangeables et nécessitent une attention particulière. Par exemple, dans Intel Fortran entier (6) et entier * 4 sont les mêmes, mais: COMPLEX ([KIND =] 4) est le même que COMPLEX * 8, COMPLEX ([KIND =] 8) ou COMPLEX * 16 , COMPLEXE ([KIND =] 16) ou COMPLEX * 32 – syscreat

+0

@syscreat Je n'ai pas traité de réel et complexe dans cette réponse, car il y a une question distincte à leur sujet. Je n'ai abordé que des entiers ici. Voir le lien au et de la réponse. Le fait que le vrai et le complexe de la même précision aient le même numéro de genre est forcé par la norme. –