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 :

incrémenter une chaine de caractère


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut incrémenter une chaine de caractère
    Bonjour,

    je programme une boucle faisant appel à une routine ou je dois changer un argument (chaine de caractère) chaque fois; par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    do i=1, Nbr
     
    call machin(file, nom_zone,.........) ! je voudrais changer de nom de zone pour chaque zone
     
    enddo
    vous auriez une idée?

  2. #2
    Membre expérimenté Avatar de Grame
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Par défaut
    Bonjour

    vous auriez une idée?
    Ben, ça dépend de ce tu veux exactement.

    Le nom zone change t-il totalement (ex : truc, machin, bidule)
    ou bien s'incrémente t-il (ex : zone.1, zone.2, ...)

    Précises ta demande.

  3. #3
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Bonjour

    Je vois deux possibilités :

    1) tu crées un tableau chaine de caractère de dimension Nbr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    character(len=100), dimension(Nbr) :: nom_zone
     
    do i=1, Nbr
      call machin(file, nom_zone(i),.........) 
    enddo
    2) tu modifis la chaine dans la boucle

    L'utilisation de trim et de adjustl te permet de supprimer les blancs.

    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
     
    character(len=100) :: nom_zone, numero, base
     
    base = "basename"
     
    do i=1, Nbr
      write( numero, * ) i
      numero = adjustl( numero )
      nom_zone = trim(basename)//trim(numero)
      call machin(file, nom_zone,.........) 
    enddo
     
    ! autre solution, tu sais que Nbr <= 9999
    character(len=4) :: numero
    character(len=100) :: nom_zone, base
     
    base = "basename"
     
    do i=1, Nbr
      write( numero, "(i4.4)" ) i
      nom_zone = trim(basename)//numero
      call machin(file, nom_zone,.........) 
    enddo
    Dans le premier cas tu as des zones (sans connaitre Nbr) :

    basename1
    basename5
    basename10
    basename122

    Dans le deuxième cas (avec i4.4) tu as des zones :

    basename0001
    basename0005
    basename0010
    basename0122

    Bon courage

  4. #4
    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
    joli le coup du i4.4!!! moi qui m'emer$¤*@ais à rajouter manuellement les zéros!!! je le retiens celui-là !!!!

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    Bonjour, désolée du retard, mais j'ai une autre solution , dites moi ce que vous en pensez (je cherche à obtenir zone 1,zone 2,....,zone Nbr)

    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
    integer filenum,Nbr
    integer, dimension(:), allocatable :: zone
    character*32, dimension(:),allocatable :: ZoneName2
    allocate(ZoneName2(Nbr))
    allocate(zone(Nbr))
     
          if(Nbr .lt. 10000) then ! Nbr : numéro de la zone
              write(filenum,102) Nbr
            else
              write(6,'('' trop de zones, numero limitees a 9999'')')
     
              stop
            end if
     102    format(i4)
      ZoneName2(Nbr) = 'Zone' // filenum
    qu'en pensez vous? ça marche très bien aussi, et je pense que je n'aurai pas de problème dans le cas d'un nombre très élevé !

    Manal

  6. #6
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Bonjour

    Tu dis que ça marche mais j'ai quelques doutes quand même. Tu déclare filenum comme un integer alors que tu l'utilises comme une chaine de caractère. D'autre part pourquoi se limiter à 9999 ?

    Sinon ça correspond à ce que je t'ai proposé sauf que tu as des espaces ou des blancs dans ta chaine. Si ça ne te gène pas tant mieux. Ce que je te proposais était plus complexes car en général la difficulté de ce genre de manip c'est d'avoir une chaine sans blanc. Après je ne sais pas ce que tu en fais. Tu n'en a peut être pas besoin !

    D'aprés le nom de tes variables ta chaine est un nom de fichier, fais attention, quelque fois mettre des blancs dans le nom d'un fichier peut être périlleu.

  7. #7
    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
    le remplissage d'un tableau, c'est une idée qui marche, mais consomme un peu de mémoire (pas gravissime c'est sûr!), cependant ce qui me gène le plus c'est le format que tu utilise le i4 cela te donne des espaces dans le nom du fichier.... ce qui peut poser des soucis...
    je comprends pas pourquoi filenum est déclaré comme integer... character marche aussi bien....

    et pius tu peux tout mettre dans le write:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    write(filename,101) NBR
    101 format('zone',i4.4,'.dat')
    cela te donnera par exemple avec NBR=18: zone0018.dat

    je te conseil de ne pas trop utiliser les espace dans les noms de fichier pour des raisons de portabilité (de même, oublie les accents et les caractères spéciaux autres que . _ ) des fois on a des surprise quand on change de machine!

    dernière chose, quand tu fais ta concaténation ( ZoneName2(Nbr) = 'Zone' // filenum ) utilise la fonction trim:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ZoneName2(Nbr) = 'Zone' // trim(filenum)
    cela a pour effet de viré les espaces en fin de chaine, très pratique quand tu as une longueur de chaine qui est variable

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 88
    Par défaut
    finalement, j'ai retenu ta dernière méthode et ça marche très bien !

    donc merci!

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

Discussions similaires

  1. incrémentation d'une chaine de caractère
    Par franco9 dans le forum Langage
    Réponses: 1
    Dernier message: 10/02/2013, 18h57
  2. Réponses: 7
    Dernier message: 29/05/2012, 16h16
  3. Incrémenter une chaine de caractères
    Par moukit233 dans le forum Langage
    Réponses: 10
    Dernier message: 11/12/2009, 15h22
  4. Réponses: 5
    Dernier message: 26/08/2008, 16h00
  5. Réponses: 7
    Dernier message: 25/04/2008, 22h36

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