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

Langage Pascal Discussion :

[LG]problème de read / readln


Sujet :

Langage Pascal

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juin 2003
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [LG]problème de read / readln
    Bonjour à tous.

    Je débute sur Pascal, je pense donc que cette question a déjà du être posée plusieurs fois (désolé ).
    Je travaille sur un petit programme qui va taper sur un petit fichier texte présent sur mon disque. Afin de rentrer les données sur ce fichier, je me sers de plusieurs petites invites afin de d'avoir un semblant de convivialité :
    writeln('Veuillez entrer blablabla');
    readln(mavariable);
    writeln('Veuillez blablabla');
    readln(mavariable2);

    Mon problème est le suivant : mon premier readln est complètement zappé lors de l'éxécution. Je pensais à un problème de tampon clavier (sur Turbo C j'arrivais à me dépatouiller avec un fflushall un peu radical), mais je n'arrive pas à trouver une commande me permettant de remettre le tampon clavier à vide.

    1. Ma supposition est-elle correcte ?
    2. Si oui, quelqu'un sait il comment faire ?
    3. Si non, quelqu'un sait-il ce que c'est ?

    Merci par avance (en espérant que je me sois pas trop mal exprimé!)

    Jérémie

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    pour vider le buffer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Procedure Vide_Buffer;
     
    begin
      inline($fa);
      memw[$40:$1A] := memw[$40:$1C];
      inline($fb);
    end;
    ne me demande pas comment ça marche!
    je ne suis pas sur que ton pb vienne du buffer...

    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
     
    Function Saisie_Texte:string;
     
    VAR
     
      ch	:char;
      txt	:string;
      fin_txt	: boolean;
     
    begin
     
      txt:='';
      fin_txt:=false;
     
      while not fin_txt do
        begin
          ch := Touche;
     
          case ch of
            'a'..'z','A'..'Z','0'..'9':
              begin
                txt:=txt+ch;
              end;
     
            #13:
              begin
                fin_txt:=true;
              end;
          end;
        end;
     
      Saisie_Texte:=txt;
     
    end;
    voila ma méthode...fais en ce que tu veux!

    saluche.
    Cutting Yours

    JiPers

  3. #3
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Ben apparemment, ça vient du buffer clavier, cars ton code marche chez moi sans problème...
    Pour vider le buffer clavier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while keypressed do readkey;
    Je suis pas sûr à 100% que ça marche, mais ça devrait fonctionner !!
    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Juin 2003
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème read / readln résolu
    Bon ben j'ai essayé vos 2 solutions de vidage de buffer mais ça marche po !
    Mais effectivement en faisant une petite boucle avec un readkey suivi d'un write, j'arrive à imiter le read et à contourner le prb.
    Je reste quand même perplexe sur pourquoi le read ne fonctionne pas correctement( d'un autre coté je vous ai pas fait voir assez de mon code, j'avais peut être des lignes "parasites").

    en tout cas, merci de vos conseils à vous 2.

    @+

  5. #5
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut!

    Je crois avoir l'explication (peut-être qu'elle a déjà été donnée). Avec Writeln, tu envois sur l'écran, une ligne de caractère PLUS le code de la touche Entrée (#13), plus exactement le retour chariot (#13+#10). Readln qui le suit, intercepte ce retour chariot, comme si tu l'avais tapé au clavier... 2 solutions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Begin
    Writeln('blablabla');
    Repeat Until(Keypressed); 
    Readln;
    Writeln('blablabla');
    Repeat Until(Keypressed);
    Readln;
    end.
    Je l'ai vérifié, ça fonctionne! Donc pas besoin de vider le buffer du clavier...
    Cela dit, je crois bien que la fonction Keypressed vide le buffer.

    Voici l'autre solution (plus simple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Begin
    Write('blablabla'+#13);
    Readln;
    Write('blablabla'+#13);
    Readln;
    end.
    Dans ce cas, la retour chariot n'est pas validé, seulement l'écriture jusqu'à la fin de la ligne...

    Bon courage! à+

    De retour parmis vous après 10 ans!!

  6. #6
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Qu'est-ce que tu racontes Sub0 ?

    Depuis quand fait-on un amalgame entre le périphérique d'entrée et le périphérique de sortie ? Il sont beau être liés, je ne pense pas qu'il faille pousser le bouchon si loin...

    Write/WriteLn s'adresse au périph de sortie (l'écran), alors que Read/ReadLn s'intéresse au périph d'entrée (le clavier).

    Je n'ai encore jamais vu un WriteLn aller écrire dans le tampon clavier...

    Pour info, le caractère #13 renvoie le curseur en début de ligne, et le caractère #10 passe à la ligne suivante. Donc la combinaison #13#10 fait revenir le curseur au début de la ligne suivante, mais n'interfère en aucun cas avec ReadLn ! Ou alors le périphérique CON fait des choses bizarres, ou bien a été reconfiguré pour lire les entrées sur l'écran. Plutôt rare, ou bien fait bien volontairement.

    Le problème ne vient manifestement pas du buffer clavier car ReadKey se chargerait de le vider dans ce cas.

    Le fait que ce ne soit que le premier ReadLn qui soit zappé prouve à lui tout seul que ta méthode, Sub0, est limite "capilotractée"...

    Vérifie, Jérémy, que tu ne charges pas ton buffer clavier (manifestement, non), que tu ne détournes pas les entrées vers l'écran ou ton autre périphérique.

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  7. #7
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut!

    J'ai essayé avec BPW, c'est peut-etre à cause de ça - J'ai remarqué ce phénomène, tout simplement en testant le code! Avec Repeat until(KeyPressed), cela ne se produit plus, ou bien avec Write(' '+#13) non plus. Les sources des fonctions sont dans l'unité WinCrt (voir la source). Ce n'est pas moi qui ai conçu ce compilateur, alors je ne fais que constater, à+
    De retour parmis vous après 10 ans!!

  8. #8
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    C'est sûr que sous Windows...

    WinCrt et compagnie n'offre qu'un "bidouillage" autour de Windows pour pouvoir créer des programmes consoles ressemblant au Dos.

    Peut-être que sous Windows clavier et écran sont liés. Mais sous Dos, à priori, il n'y a aucun raison.

    En tout cas, sur mon PC, avec BPW, l'utilisation de WriteLn ne fait pas zapper le ReadLn qui le suit...

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

Discussions similaires

  1. Read vs ReadLn
    Par Younes Ch dans le forum Langage
    Réponses: 2
    Dernier message: 15/06/2011, 19h43
  2. [Turbo Pascal] Liste chaînée, saisie Read/ReadLn, erreur d'exécution
    Par rabir dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 31/10/2009, 16h59
  3. Read vs ReadLn
    Par aminemen dans le forum Langage
    Réponses: 4
    Dernier message: 11/04/2009, 23h53
  4. Réponses: 1
    Dernier message: 28/09/2007, 21h05
  5. [TP] Read/ReadLn ?
    Par svince dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 11/09/2007, 16h20

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