Fortran 77, variable

altopic -  
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,

Je voulais savoir si dans l'instruction:

real lon,lat,sla_free(14),sla_assim(14),sla_moy(14),
S sla_moy_ass(14)

DATA (sla_moy (i), i = 1,14, 1) /14 * 0 /
DATA (sla_moy_ass (i), i = 1,14, 1) /14 * 0 /

il est possible de mettre une variable à la place du pas 14. Ce pas varie en faite à chaque fois en fonction de l'étude.
J'ai essayé de faire un programme qui enregistre ce pas dans un fichier txt pour le réutiliser dans mon programme, mais sans succès. Voici le script:
------------------------------------------------------------­------------------------------------------------------------­--------
program interval_sla
integer ok,ligne,A

open(10,file='/data/ctsiim/augee/SIMULATEUR_V_1_0/SORTIES_E­MMANUEL_CIRCU/select_point.txt',status='old',iostat=ok)
open(20,file='/data/ctsiim/augee/SIMULATEUR_V_1_0/SORTIES_E­MMANUEL_CIRCU/A.txt',status='old',iostat=ok)
if(ok /= 0) then
write(*,*) 'erreur 1 fichier xko.dat'
stop
end if

ligne = 0

do while(ok == 0) !boucle pour compter le nb.de ligne du fichier
read(10,*,iostat = ok)
if (ok == 0) ligne = ligne + 1
end do
rewind(unit=10,iostat=ok)

A=ligne/14
write(20,*)A
close(20)
call yo

END

subroutine yo

integer ok,ligne,i,j,count,A

open(20,file='/data/ctsiim/augee/SIMULATEUR_V_1_0/SORTIES_E­MMANUEL_CIRCU/A.txt',status='old',iostat=ok)

read(20,*)A
close(20)

lon,lat,sla_free(A),sla_assim(A),sla_moy(A),
S sla_moy_ass(A)

DATA (sla_moy (i), i = 1,A, 1) /A * 0 /
DATA (sla_moy_ass (i), i = 1,A, 1) /A * 0 /

------------------------------------------------------------­------------------------------------------------------------­--

Il me semble pas très logique d'effectuer un read avant d'avoir fini les déclarations.
De plus j'ai essayé avec un common entre le programme principal et la subroutine mais sans succès.

4 réponses

Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
En thèorie, en FORTRAN, il faut que le compilateur connaisse la taille du tableau avant l'exécution, c'est à dire que tu ne peux pas faire ce que tu souhaites.
par contre, tu peux utiliser un
#define A 14
si tu as un préprocesseur
Ou, peut être, un PARAMETER pourrait te déterminer la taille.
0
altopic
 
Le problème est que cette taille varie à chaque fois que je lance cette routine. L'objectif est donc de réussir à récupérer la valeur du pas et de la mettre en entrée du programme dans mes déclarations de variables.

Un parameter défini une constante il me semble?
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Comme je te dit, ce que tu cherches à faire est impossible en FORTRAN 77, c'est pour ça que le CEA avait conçu l'ESOPE.
Après, si tu fait du fortran 90 ou plus, ça doit être possible, mais je ne sais pas comment.
0
altopic
 
Merci quand même pour la réponse, je vais essayer de contourner le problème, d'ailleur f77, j'ai l'impression de faire que ça...
enfin bref, à plus et merci
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Au boulot, nous contournons le problème par l'intermédiaire du C/C++.
Les tableaux sont dimensionnés dans des fonctions C ou C++ avant d'être passer en paramètre à la fonction fortran.
Pour être plus concret, imagine le programme suivant :
subroutine fsub(p1,p2)
       REAL P3(N)
Ce code est faut si N n'est pas un parameter. Par contre le code suivant :
subroutine fsub(p1,p2,P3)
       REAL P3(N)
est juste car p3 est passé en argument, il n'y a donc pas de restriction sur sa dimension.
0
altopic
 
Merci pour la réponse, CChristian m'a répondu sur un autre post et solutionner le problème.
Si ça t' intéresse, c'est le post "problème compteur fortran".
A plus
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
http://www.commentcamarche.net/forum/affich 12936005 probleme compteur fortran
En effet, il dit la même chose que moi.
Je n'aime pas la solution de taille maximal car on risque toujours de la dépasser, à moins de mettre un garde qui vérifie que l'on ne dépasse pas. Et en plus tu prends de l'espace mémoire inutilement.
Mais si ça te va comme ça. Pas de souci.
0