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 90] Problème de fmt


Sujet :

Fortran

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 13
    Points : 3
    Points
    3
    Par défaut [Fortran 90] Problème de fmt
    Bonjour a tous.

    Je suis étudiant en école d'ingénieur (mécanique) et je dois pour un projet d'informatique rédiger un petit programme en fortran.
    Le but de ce programme étant de gérer une collection de cd audio.
    Dans ce programme j'ai besoin de faire une recherche avec un titre de chanson partiel.

    J'ai tenté une méthode un peu tordue mais elle me pose un petit problème :
    Voici ma subroutine :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    subroutine recherche
    use cds
    implicit none
    integer::flag,choix,l,i,j,k,n
    character::titre_rech
     
    do while (choix/=0)
      flag=0
      print*,'donner le titre de votre chanson'
      read*,titre_rech
      l= len_trim(titre_rech)
    !connaitre le nombre de caractere de la série de mot entrée par l'utilisateur
      do i=2,N+2
       open(unit=1,file='collec',status='old',access='direct',form='formatted',recl=100)
       read(1,rec=i,fmt='(a30)')cd%nom
    !lecture des noms des albums
       open(unit=2,file=cd%nom,status='new',access='direct',form='formatted',recl=30)
       read(2,rec=6,fmt='(a30)')cd%n
           do k=7,cd%n
    !k permet de passer d un morceau a un autre
     
              do j=0,30-l
    !j represente le decalage (espaces dans une ligne, il ne doit pas dépasser 30-la taille du mot pour rester dans le format) avant chaque comparaison
    	     read(2,rec=k,fmt='(jX,al)')cd%morceau
                 if ('titre_rech'=='cd%morceau') then
    		Read(2,rec=k,fmt='(a30)')cd%morceau
    		Print*,cd%morceau,'dans',cd%nom
    		flag=1
    	     end if
    	  end do
            end do
         end do
      If (flag/=1) then
    	Print*,'Pas de resultat pour votre recherche'
            choix=0
      end if	
    end do
     
    end subroutine recherche
    Lorsque je compile voici l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        read(2,rec=k,fmt='(jx,al)')cd%morceau
                                              1
    Warning: Unexpected element in format string at (1)
     In file 01.f90:244
    Je suppose que cela vient de l'utilisation de variable dans ma déclaration de format mais je ne vois pas comment passer outre ce problème.

    Je vous remercie d'avance.

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    En effet, un tel format est interprete comme (jx,a1) et j n'est pas un formateur valide.
    La solution est d'ecrire le format interactivement, un peu comme tu ferais un sprintf() en C.
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      character :: format(30)
     
      ! boucle sur j
      write(format, fmt='(I2.2,'x,a1')') j
      ! si necessaire, faire un len_trim sur format
      read(2, rec=k, fmt=format)
    Remarque que titre_rech est tres certainement plus grand qu'un seul caractere, donc il faudrait le declarer comme character :: titre_rech(30). Egalement, il est un peu etonnant que tu utilises le Fortran pour un tel projet. C'est en dehors du domaine d'application du langage (perl ou Python sont bien meilleurs pour ce genre de choses).

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Alors si j'ai bien compris (parce que la ca dépasse mes compétences en info) :

    Je créé, à l'aide la variable "format", une variable qui remplace la déclaration classique d'un fmt.

    J'execute la boucle j (de fmt I2.2), qui servira de facteur à 'x' qui est cependant suivi de "al" et non "a1" : J'ai une autre variable appelée L qui est le coef de la longueur du mot à lire "a".

    fmt='(I2.2,'x,a1')')
    s'écrit en réalité fmt='(I2.2,'x,aL')')

    Donc la il faudrait que je modifie (si j'ai bien compris) en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    write(format, fmt='(I2.2,'x,a',I2.2)') j,L
    Cependant je ne comprend pas la syntaxe de ta commande "write" puisque tu n'indiques pas le n° du fichier dans lequel tu écris ni même l'emplacement d'enregistrement.

    En tout cas je vais tenter ta solution et te remercie beaucoup de m'avoir aider, en espérant que tu pourras une fois de plus m'éclairer.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Apres test de ta solution plus ma modification j'obtiens cette erreur qui confirmerait qu'il ne doit pas s'agir de la commande write pour cette utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      write(format,fmt='(I2.2,'x,a',I2.2)')j,l
                              1
    Error: Syntax error in WRITE statement at (1)
     In file ajouter.f90:180

  5. #5
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Pardon, j'avais fait une erreur dans le format. Il faut que les quote de la chaine de caracteres soient doublés pour le compilateur ne les considére pas comme fermant les quotes exterieurs.
    Donc:
    write(format, '(I2.2,''x,a'',I2.2)') j, l
    Note que c'est bien deux ' et non un double-quote " (certains compilateurs acceptent les deux).

    Quant à la fonction write, elle peut prendre en argument une chaine de caractere ou un descripteur de fichier. Le compilateur utilise la bonne fonction en fonction du type des arguments. Cela pour simplifier, mais ça engendre plutôt la confusion, à mon avis...

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Avec cette syntaxe en effet ca passe la compile. Je suis en pahse de test pour voir si cela marche mais il me reste des petites erreurs à corriger.

    A premiere vue cela ne marche pas.

    En tout cas merci beaucoup.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Alors si jusqu'à tout à l'heure ca ne marchait pas c'est que j'avais trop d'erreurs ailleur mais la je pense que celle-ci vient de la ligne du write :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(format, '(I2,"x,a",I2)')j ,l
    Erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    At line 167 of file ajouter.f90
    Fortran runtime error: Missing initial left parenthesis in format
     0x,a 2
     ^
    J'ai eu beau essayer de rajouter des parentheses ca ne marche pas! Lol je suis vraiment un boulet!dsl

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Oui, bien sur, decidement je ne suis pas en forme en ce moment... Le format doit comprendre des parentheses exterieures, comme on le fait dans le write.
    Donc:
    WRITE(format, fmt='("(",I2.2,"x,a",I2.2,")")') j, l
    Ci-dessus, j'utilise des double-quote ("), les differents compilateurs a ma disposition (g77, ifc, pgf90 et pgf77) les acceptent.

    A force, ca va finir par marcher (les formats en Fortran sont assez desagreables a utiliser).

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    At line 167 of file ajouter.f90
    Fortran runtime error: Expected P edit descriptor in format 
     (0x,a 2)
       ^
    Je suis dsl.

    En lisant une liste des erreurs je crois avoir compris qu'il s'agissait d'une erreur concernant le le fait que l'entier doit etre signé ou non. Etant donné que je commence a j=0 je crois que cela vient de ca. Normalement si je remplace X par P cela devrait marcher mais je n'en suis pas sûr.

    Lorsque je remplace X par P et que je relance le programme j'obtiens cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fortran runtime error:  Record number not allowed for sequential access data transfer
    Edit :
    Apres test et affichage des différentes valeur de j, du format et de la boucle k (qui permet de passer d'un morceau de musique a un autre) j'obtiens que la boucle k s'ouvre sans soucis, et la boucle j fait les 2 premières rotation et s'arrete par l'erreur ci dessus.

    Edit:
    Apres plusieurs modifs j'arrive au fait que c'est bien un problème de réglage de ma boucle. Il reconnait bien le morceau de titre que je lui donne seulement si il se situe dans les les 2 premiere incrémentations de j (apres cela plante). La reconnaissance partielle du titre marche mais la boucle reste a régler.

    Merci beaucoup

  10. #10
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Non, P donne juste un scale factor pour les descripteurs F, E et G (les nombres flottant, quoi).
    Ton probleme est qu'un 0 n'est pas admis devant le specificateur X. Il va donc falloir ameliorer ton algo de construction du format:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      IF (j .EQ. 0) THEN
          WRITE(format, fmt='("(a",I2.2,")")') l
      ELSE
          WRITE(format, fmt='("(",I2.2,"x,a",I2.2,")")') j, l 
      ENDIF
    et de la meme facon pour le cas l == 0 (si ce cas est possible - mais ca m'etonnerait).

    Remarque aussi que si j et l sont inferieurs a 10, il faut utiliser le descripteur I1.1 pour ne pas se retrouver avec un espace superflu. Ca devient vite un cauchemar.

    Une solution propre serait de faire ainsi:
    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
     
       CHARACTER*1 c1
       CHARACTER*2 c2_j
       CHARACTER*2 c2_l
     
       IF (j .LT. 10) THEN
          WRITE(c1, '(i1)') j
          c2_j = '0' // c1
       ELSE
          ! en supposant que j ne peux pas etre plus grand que 100
          WRITE(c2_j, '(i2)') j
       ENDIF
     
       ! idem pour l en remplissant c2_l
       IF (l .LT. 10) THEN
         WRITE(c1, '(i1)') l
         c2_l = '0' // c1
       ELSE
         ! idem, on suppose que l < 100
         WRITE(c2_l, '(i2)') l
       ENDIF
     
       ! on construit le format final (suppose que l toujours different de 0)
       IF (j .NE. 0) THEN
          format = '(' // c2_j // 'x,a' // c2_l // ')' 
       ELSE
          format = '(a' // c2_l // ')'
       ENDIF
    Mais on doit faire pas mal d'hypotheses. Comme je l'ai ecrit plus haut, le Fortran n'est pas adapte pour ce genre de choses.

    Edit: je viens de voir tes dernieres nouvelles. Apparemment, les formats sont plus souples que je ne le pensais (un 0 est admis). Donc ce que j'ecris ci-dessus n'est pas utile - mais cela pourra te servir un jour, on ne sait jamais!

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Ok je vois ce que tu veux m'expliquer (si je peux te tutoyer).

    Dans le cas ou j=0 il faut que je ne mette que ma variable l en facteur.

    Il faut par des boucles if déterminer le format de chacune de mes variable j et l afin de bien les dimensionner.

    Cependant je n'ai pas compris l'histoire de l'espace superflu?Est ce génant?

    Pour tes hypotheses pas de soucis on restreint le nombre de caractères de chaque titre de chansons a 30 caracteres. donc l sera touours inférieur a 100.
    idem pour j.

    En tout cas je te remercie grandement de ton aide et du temps que tu passes a m'aider.

    Edit :

    Voila ou j'en suis :

    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
    do k=8,8+nm
    !k permet de passer d un morceau a un autre
    print*,'k=',k !vérif
    read(2,rec=k,fmt='(a30)')titre !vérif
    print*,'titre=',titre !vérif
              do j=0,30-l
    	     WRITE(format,fmt='("(",I2,"p,a",I2,")")') j, l  
                 print*,'j=',j !vérif
                 print*,'format=',format  !vérif  
                 !j represente le decalage (espaces dans une ligne, il ne doit pas              dépasser 30-la taille du mot pour rester dans 
     
                 !le format) avant chaque comparaison
    	     read(2,rec=k,fmt=format)titre
                 print*,'titre=',titre !vérif
                 if (titre_rech==titre) then
    		read(2,rec=k,fmt='(a30)')titre
                    Print*,titre,'dans  ',album
    		flag=1
    	     end if
    	close(2)  
      end do
    Ma boucle reussi bien les 2 premieres itérations mais lorsque j'utilises p en non X dans le format.

    Il va donc falloir que j'utilises le If pour pouvoir choisir quel format a adopter.

    Apres je ne vois pas pourquoi mon programme plante. je vais bien finir par trouver!

    Edit :

    j'en arrive donc la :
    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
    29
     
    do k=8,8+nm
    !k permet de passer d un morceau a un autre
    print*,'k=',k !vérif
    read(2,rec=k,fmt='(a30)')titre !vérif
    print*,'titre=',titre !vérif
       do j=0,30-l
         If (j==0) then 
     
           WRITE(format, fmt='("(a",I2.2,")")') l
         else
           WRITE(format, fmt='("(",I2.2,"x,a",I2.2,")")') j, l
         endif 
     
           print*,'j=',j !vérif
           print*,'format=',format  !vérif  
            !j represente le decalage (espaces dans une ligne, il ne doit pas dépasser 30-la taille du mot pour      
     
       ! rester dans le format) avant chaque comparaison
     
            read(2,rec=k,fmt=format)titre
            print*,'titre=',titre !vérif
              if (titre_rech==titre) then
             	read(2,rec=k,fmt='(a30)')titre
                    Print*,titre,'dans  ',album
    		flag=1
              end if
    	close(2)  
      end do

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Erreur enfin trouvée! Je ferme le fichier de l'album après j=0 donc lorsque je fait la seconde incrémentation il ne trouve plus rien puisque le fichier est fermé!

    Ma quel boulet je fais!

    merki normalement c'est bon! Je te doit un bon petit coup de main!

    edit :

    Apres avoir reglé les soucis de boucles c'est bon tout est opérationnel!

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Bon ba décidément je pense pas être fait pour l'info

    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
    29
    30
    31
    32
    33
    Subroutine recherche (ncd)
     
     
    integer::ncd
    integer::choix,choix_2,choix_3,i,j,nm,flag,annee_rech,annee
    character(len=30)::album,album_rech
    character(len=30)::auteur_rech,auteur
    character(len=2)::type_rech,type
    character(len=30)::titre_rech,titre
    character(len=3)::choix_rech
     
     
    Open (1,file='collec',form='formatted',access='direct',status='old',recl=100)   !ligne 151
    Read (1,rec=1,fmt='(i4)')ncd
     
    Do while (choix/=0)
     
    	Print*,'Bienvenue dans le menu de recherche'
    	Print*,'Choix 1) Vous souhaitez trouver des albums repertories dans la collection?'
    	Print*,'Choix 2) Vous souhaitez trouver directement une liste de chansons?'
    	Print*,'Choix 0) Retour au menu principal'
    	Print*,"Veuillez entrer le numero de votre choix svp"
            read*,choix
    	flag=0
     
     	If (choix > 2) then
    	   Print*,'Numero de choix incorrect, retour au menu.'
    	end if
    	If (choix == 0) then
    			Print*,'Retour au menu principal'
    			choix=0
    	end if
    	If (choix == 1)   then
    lorsque le programme m'affiche la ligne : (Print*,)"Veuillez entrer le numero de votre choix svp", le programme sort avec comme erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fortran runtime error : End of file
    Que faire je ne sais pas ce qu'il se passe! je fais simplement un read en dessous de la variale recevant le résultat entré par l'utilisateur. :

  14. #14
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Avant de faire le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Do while (choix/=0)
    il faut initialiser la valeur de choix a une valeur non-nulle (-1 par exemple).
    Sinon, je ne vois pas de cause d'erreur dans ce code.

    (note que if (choix == 0) est vrai, il est inutile de mettre choix a 0 ensuite.

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    idem ca me met la même erreur au même endroit. C'est à s'en arracher les cheveux!
    Comme si le read faisait sortir de la boucle!

    Je ne comprend pas

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    Subroutine recherche (ncd)
     
    implicit none
    integer::ncd
    integer::choix_2,choix_3,i,j,nm,flag,annee_rech,annee,choix
    character(len=30)::album,album_rech
    character(len=30)::auteur_rech,auteur
    character(len=2)::type_rech,type
    character(len=30)::titre_rech,titre
    character(len=3)::choix_rech
     
     
     
    Open (1,file='collec',form='formatted',access='direct',status='old',recl=100)   
    Read (1,rec=1,fmt='(i4)')ncd
     
    choix=-1
     
    Do while (choix/=0)
     
    	Print*,'Bienvenue dans le menu de recherche'
    	Print*,'Choix 1) Vous souhaitez trouver des albums repertories dans la collection?'
    	Print*,'Choix 2) Vous souhaitez trouver directement une liste de chansons?'
    	Print*,'Choix 0) Retour au menu principal'
    	Print*,'Veuillez entrer le numero de votre choix svp'
            read*,choix
     
    	flag=0
     	If (choix > 2) then
    	   Print*,'Numero de choix incorrect, retour au menu.'
    	end if
     
    	If (choix == 1)   then
    			choix_2=-1
    			Do while (choix_2/=0)
     
    				Print*,'Vous souhaitez trouver un album a partir de : '
    				Print*,'Choix 1) Son nom?'
    				Print*,'Choix 2) Son auteur?'
    				Print*,'Choix 3) Son style?'
    				Print*,'Choix 4) Son annee?'
    				Print*,'Choix 0) Retour au menu précédent.'
    				Print*,'Veuillez entrer le numero de votre choix svp.'
    				Read*,choix_2
     
    				flag=0				
    				Select case(choix_2)
     
    					Case default
    						Print*,'Numero de choix incorrect, retour au menu.'
    					Case (0)
    						Print*,'Retour au menu précédent'
    						choix_2=0
    					Case (1)
    					 Print*,'Veuillez entrer le titre de votre album svp?'
    				         Read*,album_rech		
    				          do i=2,ncd+1
    					   Read (1,rec=i,fmt='(a30)')album
     
     	                                    If (album==album_rech) then
    					     flag=1
    					     open(2,file=album,form='formatted',status='old')
    								! call affichage
    					     close(2)
    					    end if
    					    If (flag/=1) then
    					     Print*,' Album non trouve dans la collection'
    					    end if
    					   end do
     
      					case(2)
     
        print*,"veuillez entrer le nom de l'auteur"
        read*,auteur_rech
           do i=2,ncd+1
     
             read(1,rec=i,fmt='(a30)')album
             open(2,file=album,form='formatted',status='old')
             read(2,rec=3,fmt='(a30)')auteur
                if (auteur==auteur_rech) then
                  flag=1
     
                !  call affichage_album
                end if
                if (flag/=1) then
                   print*,"aucun album dans la collection ne contient ce nom d'auteur"
                end if
           end do
     
      case(3)
     
       print*,"veuillez entrer le type de l'album"
       read*,type_rech
          do i=2,ncd+1
     
            read(1,rec=i,fmt='(a30)')album
            open(2,file=album,form='formatted',status='old')
            read(2,rec=2,fmt='(a30)')type
                if (type==type_rech) then
                   flag=1
                 !  call affichage_album
                end if
                if (flag/=1) then
                   print*,'aucun album ne correspond a ce type dans la collection'
                end if
          end do
     
      case(4)
     
       print*,"veuillez entrer l'annee de l'album recherche"
       read*,annee_rech
          do i=2,ncd+1
     
            read(1,rec=i,fmt='(a30)')album
            open(2,file=album,form='formatted',status='old')
            read(2,rec=5,fmt='(i4)')annee
            if (annee==annee_rech) then
                   flag=1
                  ! call affichage_album
            end if
             if (flag/=1) then
                   print*,'aucun album ne correspond a cette annee dans la collection'
             end if
          end do
     
      end select
      end do !do while choix_2
     end if   !choix=1
     
    If (choix == 2) then
     
     choix_3=1
     do while (choix_3/=0)
     
       Print*,'Choix 1) Vous souhaitez trouver une chanson a partir de son nom? '
       Print*,"Choix 2) Vous souhaitez trouver toutes les chansons d'un meme type?"
       Print*,"Choix 3) Vous souhaitez trouver toutes les chansons d'un meme auteur?"
       Print*,"Choix 4) Vous souhaitez trouver toutes les chansons d'une annee?"
       Print*,'Choix 0) Retour au menu precedent'
       Print*,'Veuillez donner le numero de votre choix svp ex :1'
       Read*,Choix_3
       flag=0
     
       select case (choix_3)
     
          Case default
    	Print*,'Numero de choix incorrect, retour au menu.'
     
          Case (0)
    	Print*,'Retour au menu précédent'
    	choix_3=0
     
          case (1)
      	Print*,'Donnez le titre de votre chanson même partiel svp'  
            call recherche_partielle
          case (2)
    	Print*,'Donnez le type de chansons recherche svp. Ex : pk, hv...'
    	Read*,type_rech
             do i=2,ncd+1
               read(1,rec=i,fmt='(a30)') album
               open(2,file=album,form='formatted',status='old') 
               read(2,rec=3,fmt='(a2)') type
                 if (type==type_rech) then
                  flag=1
                  read(2,rec=6,fmt='(i2)') nm
                   do j=7,7+nm
                     read(2,rec=j,fmt='(a30)')titre
                     print*,titre
                   end do
                 end if
              end do
           if (flag/=1) then
             print*,'pas de resultats pour votre recherche'
           end if 
     
          case (3)
     
            print*,"veuillez entrer le nom de l'auteur recherché"
            read*,auteur_rech
             do i=2,ncd+1
               read(1,rec=i,fmt='(a30)') album
               open(2,file=album,form='formatted',status='old') 
               read(2,rec=3,fmt='(a30)') auteur
                 if (auteur==auteur_rech) then
                  flag=1
                  read(2,rec=6,fmt='(i2)') nm
                   do j=7,7+nm
                     read(2,rec=j,fmt='(a30)')titre
                     print*,titre
                   end do
                 end if
              end do
           if (flag/=1) then
             print*,'pas de resultats pour votre recherche'
           end if 
     
     
           case (4)
     
    	Print*,"Veuillez entrer l'annee recherchee svp"
    	Read*,annee_rech
     
    	do i=2,ncd+1
    	  Read(1,rec=i,fmt='(a30)')album
    	  Open(2,file=album,form='formatted',status='old')
    	  Read(2,rec=5,fmt='(i4)')annee
     
                If (annee==annee_rech) then
     		flag=1
    		read(2,rec=6,fmt='(i2)')nm		 
    		  do j=7,7+nm
    		    read(2,rec=j,fmt='(a30)')titre
    		    print*,titre
    		  end do
    	    end if
    	end do
     
    	If (flag/=1) then
    	  print*," Pas de morceaux pour l'annee recherchee"
    	end if
     
     
         end select
     
      end do    !do while choix_3
    end if  !choix=2
     
    end do    !do while choix
     
    end subroutine recherche

  16. #16
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Je ne vois pas trop d'ou viens l'erreur (je n'ai pas lu tout le code).
    Une possibilite est l'utilisation des unites dans lesquelles tu lis. Le Fortran reserve les unites 0, 5 et 6 pour stderr, stdin, stdout, respectivement. Il est possible que ton compilateur reserve d'autres unites, comme 1 et 2 que tu utilises. En general, il est conseille d'utiliser les unites a partir de 10 (le maximum dependant du compilateur). Essaie d'abord de faire des READ sur l'unite 5 pour obtenir les reponses utilisateurs.

    Concernant ton algorithme, l'entrelacement de demandes a l'utilisateur et lecture de bases de donnees est un peu deroutant - le flux de logique est un peu difficile a suivre. Note egalement que tu OPEN des unites que tu ne CLOSE pas.

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    Voici mes dernieres nouvelles

    Je viens de résoudre le problème. Celui ci venait de la premiere ligne le "ncd" dans le nom de la subroutine... On peut dire que ca m'aura pris le temps mais je vois le bout du tunnel pour ce qui concerne la recherche.

    Merci Dazumba pour ton aide!

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

Discussions similaires

  1. [Fortran 77] Problème de compilation avec G77
    Par billybob2 dans le forum Fortran
    Réponses: 1
    Dernier message: 15/06/2007, 08h18
  2. Réponses: 2
    Dernier message: 25/04/2007, 17h44
  3. Réponses: 4
    Dernier message: 30/03/2007, 10h13
  4. Réponses: 8
    Dernier message: 01/06/2005, 09h45
  5. [Fortran 77] Problème de compilation
    Par Kenji dans le forum Fortran
    Réponses: 26
    Dernier message: 23/05/2005, 16h07

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