Fortran 77, variable
altopic
-
Char Snipeur Messages postés 10112 Date d'inscription Statut Contributeur Dernière intervention -
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_EMMANUEL_CIRCU/select_point.txt',status='old',iostat=ok)
open(20,file='/data/ctsiim/augee/SIMULATEUR_V_1_0/SORTIES_EMMANUEL_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_EMMANUEL_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.
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_EMMANUEL_CIRCU/select_point.txt',status='old',iostat=ok)
open(20,file='/data/ctsiim/augee/SIMULATEUR_V_1_0/SORTIES_EMMANUEL_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_EMMANUEL_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.
A voir également:
- Fortran 77, variable
- +33 1 87 21 77 77 - Forum Vos droits sur internet
- Impossible de créer le fichier de travail. vérifiez la variable d'environnement temp ✓ - Forum Word
- Vba range avec variable ✓ - Forum VB / VBA
- 01 87 21 77 77 ✓ - Forum Mobile
- Vba excel sélectionner une plage de cellules variable ✓ - Forum VB / VBA
4 réponses
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.
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.
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.
Après, si tu fait du fortran 90 ou plus, ça doit être possible, mais je ne sais pas comment.
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 :
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.
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.
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.
Un parameter défini une constante il me semble?