IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

[Fortran 95] Surcharge de WRITE


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Par défaut [Fortran 95] Surcharge de WRITE
    Bonjour à tous.... voilà mon problème, je cherche à faire une fonction équaivalente à deux write, un qui écrit à l'écran et l'autre qui écrit dans un fichier de log

    mon souci est que je passe parfois seulement du texte, parfois du texte et des variables... cependant, petit aspect simplificateur, le format est imposé (pas de passage de format en parametre), le fichier est tjrs le même...

    voilà ce que j'ai écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function LogVar(name,var)
    integer Logvar !permet de retourner 0 quand tout va bien
    Character(len=20),intent(in) :: name !une petite chaine de caratère
    real(kind=kind(1.d0)),intent(in) :: var!une variable de type real
    	open(unit=75,file="Fox1D.log",status="unknown",position="append")
    	write(*,*)name,var
    	write(75,*)name,var
    	close(75)
    	LogVar=1
    	return
    end function logVar
    que j'ai mis en fin d'un module 'fileutils' avec bloc interface mais je récupère une erreur de compilation "statement not recognised" au niveau du fichier principal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    program Fox1D
    !section use:
    use fileutils
    !Declarations de variables
    implicit none
    character(len=20),parameter:: bob="coucou"
    real(kind=kind(1.d0)),parameter :: val=1.d0
     
    LogVar(bob,val)
     
    END program Fox1D
    (notez les '*' dans les write, c'est juste pour pas m'embêté avec ça pour le moment....)

    d'où deux question: comment faire marché cela? et: y a-t-il pas un moyen des faire une fonction avec une déclaration equivalent à Write (ou print, je suis pas raciste) plus simple ?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    Tu ne pourras pas vraiment reproduire la fonctionnalité du write. En général, le write n'est d'ailleurs pas implanté par un appel à une fonction unique, mais par une série d'appel à plusieurs fonctions (genre call WriteBegin, call WriteInt, call WriteInt, ..., call WriteEnd).

    Les pistes de solution que je vois :

    • Une fonction avec des arguments optionnels
    • Des fonctions pour chaque type
    • Réplication de la stratégie des compilateurs pour le write
    • Tu oublie tout ça et tu boucle sur le unit


    Fonction avec des arguments optionnels

    Tu fais une fonction avec (disons) 5 entiers (I1 à I5), 5 réels (R1 à R5), 5 logiques..., tous optionnels. À l'appel, tu fais :

    k = MyWrite(Titre,I1=i,R1=ABC)

    Fonctions pour chaque type

    C'est une solution plus limité, mais ça dépend des besoins :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    module LogWrites
     
       interface MyWrite
          module procedure MyWriteString
          module procedure MyWriteInteger
          module procedure MyWriteReal4
          module procedure MyWriteReal8
          module procedure MyWriteLogical
          module procedure MyWriteTypeUtileDansMonApplication
       end interface
     
    contains
     
       function MyWriteString(Texte,S)
          character(*), intent(in) :: Texte
          character(*), intent(in) :: S
          ...
       function MyWriteInteger(Texte,i)
          character(*), intent(in) :: Texte
          integer, intent(in) :: i
          ...
    end module
    program Test
    ...
    k = MyWrite(Titre,R)
    k = MyWrite(Titre2, a /= b)
    ...
    Réplication de la stratégie des compilateurs pour le write

    Très semblable à la précédente. Tu mets les write internes des fonctions advance NO. Tu dois avoir une fonction terminale pour dire au writes que la ligne est complète. Un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    k = MyWrite(Titre)
    k = MyWrite(i)
    k = MyWrite(R)
    call MyWriteEnd
    ...
    Oublie tout ça et boucle

    Si le but est uniquement d'éviter d'avoir tous les write en double, il me semble plus simple de faire de simples boucles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
    integer :: LogUnits(2)
    integer :: iUnit
    ...
    LogUnits(1) = Logical unit de StdOut ou StrErr (Output_Unit ou Error_Unit si tu as accès au module intrinsic ISO_FORTRAN_ENV de F2003)
    LogUnits(2) = Unit du fichier FoxTruc
    ...
    do iUnit = 1,2
       write(Units(iUnit),...) Titre, liste des variables
    enddo
    ...

  3. #3
    Membre émérite Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Par défaut
    merci pour tes solution, je crois que je vais utiliser la seconde solution car mon principal objectif était de ne pas avoir à ecrire deux write à chaque fois et je savais pas que cette solution était possible...

    cela dit cela aurait été plus "beau" de faire un petit module à part avec toute les fonctions dedans mais tu as confirmé mes crainte d'une lourde programation à éfectué et j'ai un peu un manque de temps....

    encore merci popur tes solutions...

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

Discussions similaires

  1. Read et write un fichier avec Fortran
    Par jill_ dans le forum Fortran
    Réponses: 7
    Dernier message: 07/01/2013, 18h34
  2. Surcharge de Write
    Par Fortran90 dans le forum Fortran
    Réponses: 2
    Dernier message: 12/02/2007, 23h56
  3. [Fortran][Novice] Write dans un fichier
    Par panda31 dans le forum Fortran
    Réponses: 4
    Dernier message: 19/07/2006, 08h34
  4. write() dans une socket.. unix
    Par slack dans le forum Réseau
    Réponses: 5
    Dernier message: 18/12/2002, 20h42
  5. Réponses: 8
    Dernier message: 20/11/2002, 11h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo