Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    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?

  2. #2
    Membre habitué
    Inscrit en
    mai 2010
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : mai 2010
    Messages : 122
    Points : 132
    Points
    132

    Par défaut

    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

  3. #3
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    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,

  4. #4
    Membre habitué
    Inscrit en
    mai 2010
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : mai 2010
    Messages : 122
    Points : 132
    Points
    132

    Par défaut

    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

  5. #5
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    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???

  6. #6
    Membre habitué
    Inscrit en
    mai 2010
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : mai 2010
    Messages : 122
    Points : 132
    Points
    132

    Par défaut

    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 :
    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é.

  7. #7
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •