2017-08-16 4 views
1

Je tente d'accéder à un bloc de données, la façon dont il est définit comme suitbloc de données Fortran 77 clarification

 DATA NAME /'X1','X2','X3','X4','X5','X6','X7','X8','X9','10','11',00028650 
    1'12','13','14','15','16','17','18','19','20','21','22','23','24'/ 00028660 

Le code est sur papier. Notez qu'il s'agit d'un ancien code, la seule chose que j'essaie de faire est de comprendre comment le tableau est indexé. Je n'essaie pas de le compiler.

La façon dont il est accessible est comme suit

I = 0 
Loop 
    I = I + 1 
    write (06,77) (NAME(J,I),J=1,4) //this is inside a write statement. 
end loop       //77 is a format statement. 

Je ne sais pas comment il est indexé, si vous les gars peuvent faire la lumière, ce serait génial.

+0

Vous aurez besoin de montrer la déclaration de 'name' pour que nous comprenions cela complètement, et donner le code complet pas de pseudo-code. Cependant, je suppose que vous avez un _IO implicite do loop_. – francescalus

+0

@francescalus J'ai modifié le code du mieux possible. S'il vous plaît regardez-le. Les noms à des fins de conversation vont être deux caractères. C'est ce que j'ai dans le code, je l'ai juste changé en chiffres pour les fins de cette question. – LionsFan

+0

Avez-vous quelque chose comme 'character * 2 name (4,6)'? – francescalus

Répondre

1

La syntaxe (expr, intvar=int1,int2[,int3]) fait largement référence à une boucle DO implicite . Il y a plusieurs endroits où une telle chose peut se produire, et une déclaration d'entrée/sortie est un tel endroit.

Une boucle DO implicite évalue l'expression expr avec la variable de commande entier faire intvar séquentiellement prenant les valeurs initialement int1 dans les étapes de int3 jusqu'à ce que soit atteint/dépassé la valeur int2. Ce contrôle de boucle est exactement ce que l'on trouverait dans une instruction do loop.

Dans le cas de la question, l'expression est name(j,i), la variable entière j est la variable de boucle, en prenant des valeurs comprises entre les limites 1 et 4. [La taille de l'étape int3 n'est pas prévu est traité comme si 1.] La déclaration de sortie est donc exactement comme

write(6,77) name(1,i), name(2,i), name(3,i), name(4,i) 

comme il convient de noter que les éléments de la boucle implicite sont développés dans l'ordre. i lui-même provient de la boucle contenant cette déclaration de sortie.

name peut faire référence à une fonction, mais étant donné la présence d'une instruction data l'initialisant, elle doit en quelque sorte être déclarée en tant que matrice de rang 2 (caractère). L'initialisation n'est pas importante par ailleurs.

+0

pouvez-vous expliquer plus loin dans le cas de i = 1, qu'est-ce que le nom (1, i) est égal à et ainsi de suite et pourquoi? Ce qui me rejette, c'est qu'il ressemble à un tableau 2D. – LionsFan