Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > Fortran
Fortran Forum d'entraide sur la programmation en Fortran. Avant de poster -> FAQ Fortran
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/12/2012, 23h13   #1
ByNikki
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2012
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : décembre 2012
Messages : 5
Points : 1
Points : 1
Par défaut Lecture / écriture fichier Fortran

salut ,
j'ai écrit un programme qui fait le produit de deux matrices et enregistre la matrice résultante dans un fichier texte .
Sauf que l'affichage n'est pas correcte , je veux un affichage de la matrice ligne par ligne et non pas tout les éléments dans la même ligne .

voilà le code sous Fortran

program produit_matrice
integer :: i,j,k,n
real,dimension(:,:),allocatable :: A,B,C
print*,'entrez la dimension des matrices'
read*,n
allocate(A(n,n),B(n,n),C(n,n))
!--- saisie des matrices A et B --- !
print*,'entrez les elements de A '
do i=1,n
do j=1,n
read*,A(i,j)
end do
end do
print*,'entrez les éléments de B '
do i=1,n
do j=1,n
read*,B(i,j)
end do
end do
!--- calcul de la matrice C -----!
do i=1,n
do j=1,n
C(i,j)=0
do k=1,n
C(i,j)=C(i,j)+A(i,k)*B(k,j)
end do
end do
end do
do i=1,n
print*,c(i,:)
end do
!--- saisie de la matrice C dans un fichier texte ---!
open(15,file='matrix.txt',action='write',form='formatted',status='replace')
write(15,*) C
close(15)
end program


Bonne fin de soirée !
Et j'espère que quelqu'un pourrait me dire ce que je dois ajouter/modifier.
ps : je me demande si l'option advance=Yes/No pourrait aider ,si oui ,comment l'utiliser?
ByNikki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 10h51   #2
Marlan
Membre habitué
 
Inscription : mai 2010
Messages : 111
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 111
Points : 109
Points : 109
Salut,

Ton problème vient directement du format que tu utilises lors de ton écriture.

En effet, tu ne lui spécifies pas combien d'élément tu souhaite voir écrit sur une ligne.

Si tu veux qu'il écrive correctement une ligne de la matrice, il faut lui spécifier combien d'éléments contient la ligne en question.

Pour ce faire, tu peux par exemple recourir à la syntaxe suivante :

Code :
1
2
3
4
5
6
7
8
 
CHARACTER(99) :: FMT

write(FMT,'(i0,a,i0,a,i0)')size(C,dim=2),'f',50,'.',10

do i=1,n
write(15,trim(adjustl(FMT)))C(i,:)
end do
Ce que fait FMT : le size(C,dim=2) va représenter ton nombre de colonne. Le format 'f' dit que tu vas écrire des réels en leur réservant 50 espaces par nombre avec un maximum de 10 chiffres après la virgules (ce qui est la signification du 50.10).

Ton fichier sera alors comme tu l'auras souhaité.

En espérant avoir répondu à ta question,

Marlan
Marlan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 10h58   #3
ByNikki
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2012
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : décembre 2012
Messages : 5
Points : 1
Points : 1
Par défaut Nikki

Salut, j'ai fait comme ce que t'as dit mais ,ca m'affiche une erreur lors de l’exécution au niveau de la ligne :
write(15,trim(adjustl(FMT)))C(i,
ByNikki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 12h43   #4
Marlan
Membre habitué
 
Inscription : mai 2010
Messages : 111
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 111
Points : 109
Points : 109
Effectivement, il y avait une erreur. Voici la version corrigée:

Code :
1
2
3
4
5
6
7
8
9
10

 
CHARACTER(99) :: FMT

write(FMT,'(a,i0,a,i0,a,i0,a)')'(',size(C,dim=2),'f',50,'.',10,')'

do i=1,n
write(15,trim(adjustl(FMT)))C(i,:)
end do
Marlan est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/12/2012, 13h43   #5
ByNikki
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2012
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : décembre 2012
Messages : 5
Points : 1
Points : 1
Par défaut ByNikki

Waouw , ca marche à merveille !
Mais stp tu pourrai m'expliquer le rôle de chaque ligne ?
Code :
1
2
write(FMT,'(a,i0,a,i0,a,i0,a)')'(',size(C,dim=2),'f',50,'.',10,')' ===> sert à quoi ca ?
write(15,trim(adjustl(FMT)))C(i,:)      ===> ca fait quoi ca aussi???
ByNikki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 14h20   #6
Marlan
Membre habitué
 
Inscription : mai 2010
Messages : 111
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 111
Points : 109
Points : 109
Citation:
write(FMT,'(a,i0,a,i0,a,i0,a)')'(',size(C,dim=2),'f',50,'.',10,')'
Cette ligne sert à te définir un format d'écriture. Un format en fortran s'écrit de la façon suivante :
'(NTM[.O])' avec N : le nombre de colonne, T le type de format, M le nombre de caractères réservés à chaque donnée de tes colonnes et, en option (indiqué entre [ ]) le nombre de caractères réservés après le '.' si en format réel.

Le format doit être indiqué avec une variable de type character

En somme, ici avec cette écriture nous disons au code :
Stockes dans une variable FMT de type caractère un :
a : caractère (ici : une parenthèse ouverte ( )
i0 : entier (ici le nombre de colonnes de la matrice à écrire : size(C,dim=2))
a : caractère (ici on indique au code que le format sera de type réel : f)
i0 : entier (ici le nombre de caractères à réserver à chaque donnée : 50 [mais on aurait pu mettre moins])
a : caractère (ici puisque l'on utilise des réels, il faut spécifier combien de décimale on souhaite avoir (d'où le . pour la séparation))
i0 : entier (le nombre de décimales que l'on souhaite avoir : ie : le nombre de caractères réservés aux décimales)
a : caractère (parenthèse fermée ) )
En somme, si l'on imprimait FMT, l'on aurait : FMT=(NB_COLONNEf50.10)

Ensuite vis à vis de la ligne :
Citation:
write(15,trim(adjustl(FMT)))C(i,: )
Cette ligne se lit :
Ecris dans l'unité de fichier 15, avec le format FMT la ligne courante de C

Les fonction trim(adjustl(FMT)) signifient que l'on réajuste la variable FMT en retirant tous les blancs (car FMT est dans notre cas un character de 99 éléments dont on en utilise qu'une petite partie d'où le réajustement).

La boucle d'écriture t'assureras quant à elle que les données sont bien écrites dans l'ordre désiré.
Marlan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 21h04   #7
ByNikki
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2012
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : décembre 2012
Messages : 5
Points : 1
Points : 1
Par défaut ByNikki

Merci , infiniment !
ByNikki est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h27.


 
 
 
 
Partenaires

Hébergement Web