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

C Discussion :

kbhit/conio.h


Sujet :

C

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 605
    Par défaut kbhit/conio.h
    Bonjour

    J'ai appris à programmer sous BorlandC, je programme actuellement sous Linux et je compile avec gcc.
    J'aurais besoin de kbhit() ou de quelquechose d'équivalent afin de placer le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      do
      {
       printf("Voulez-vous avoir un autre intervalle ? (o/n)\n");
       c=toupper(getchar());
      } while (c!='O' && c!='N');
    J'ai l'impression que je pourrais mettre un getchar() avant pour vider le tampon, mais comme je ne sais pas pourquoi je dois le mettre, je préfèrerais avant de mettre le getchar() vérifier s'il y a quelque chose qui est en attente !

    Il est peut-être important de dire qu'avant je lis des données avec scanf (c'est imposé).




    Ça serait presque le purge (http://www.developpez.net/forums/sho...d.php?t=140518) d'Emmanuel Delahaye...
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Je crois qu'il y a une fonction pour vider le tanpon clavier,sinon pour repondre exactement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while (kbhit()!=0)
           getch();
    Voila...

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 605
    Par défaut
    Mon problème est que je n'ai pas kbhit !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Sous linux ya pas kbhit?

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 605
    Par défaut
    S'il y est, je ne le trouve pas ! De même pour conio.h...
    Je vais demander ailleurs : c'est peut-être par ce que j'ai une version de test et que je viens de trouver un bug ! Qui sais ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par troumad
    J'ai appris à programmer sous BorlandC,
    Alors j'espère que tu as appris à faire la différence entre C standard et extensions Borland C...
    Citation Envoyé par troumad
    je programme actuellement sous Linux et je compile avec gcc.
    J'aurais besoin de kbhit() ou de quelquechose d'équivalent afin de placer le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      do
      {
       printf("Voulez-vous avoir un autre intervalle ? (o/n)\n");
       c=toupper(getchar());
      } while (c!='O' && c!='N');
    Non. getchar() n'est pas fait pour saisir "o<enter>", soit 2 caractères...
    J'ai l'impression que je pourrais mettre un getchar() avant pour vider le tampon, mais comme je ne sais pas pourquoi je dois le mettre, je préfèrerais avant de mettre le getchar() vérifier s'il y a quelque chose qui est en attente !
    Stop à la bidouille ! C'est pour éviter ce genre d'interrogation que le principe de Bonne Conception est :
    1. salir()
    2. nettoyer()
    et non
    1. nettoyer() (quoi ?)
    2. salir() (beark...)
    C'est le bon sens, non ? Chez moi, c'est comme ça en tout cas, sinon, avec 5 personnes à la maison, je te raconte pas la porcherie... La fonction de saisie précédente doit donc être suivie du nettoyage nécessaire. C'est aussi simple que ça, et ce systématiquement.
    Il est peut-être important de dire qu'avant je lis des données avec scanf (c'est imposé).

    Ça serait presque le purge (http://www.developpez.net/forums/sho...d.php?t=140518) d'Emmanuel Delahaye...
    kbhit() n'est pas portable et n'a rien à voir. D'autre part, on ne se sert pas d'implémentation pour spécifier un problème. Enfin, pourquoi est-ce que scanf() est imposé ? Imposé par qui d'abord ?

    Montre l'ensemble du code qu'on y voit clair...

    Sinon, je me bagarre pour que toutes les saisies soient faites avec fgets() + clean() + la fonction de conversion qui va bien... Le message a du mal à passer et certains continuent à utiliser des getchar() tous seuls ou des scanf() sans le maitriser...

    Explications et solutions ici :

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par miron
    Sous linux ya pas kbhit?
    Non.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par miron
    Je crois qu'il y a une fonction pour vider le tanpon clavier,sinon pour repondre exactement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while (kbhit()!=0)
           getch();
    Voila...
    N'importe quoi...

  9. #9
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Je suis désolé
    alors je vais arreter de repondre, puisque out ce que je dit ca a l'air detre des betises.

  10. #10
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par miron
    Je suis désolé
    alors je vais arreter de repondre, puisque out ce que je dit ca a l'air detre des betises.
    C'est une bonne idée ça...

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par miron
    Je suis désolé
    alors je vais arreter de repondre, puisque out ce que je dit ca a l'air detre des betises.
    C'est possible. Tout le monde ne sait pas répondre (du moins dans un premier temps). Par contre tout le mondre peut lire et apprendre...

    Quand j'ai débarqué sur Internet en 1999, avec mes 10 ans de C, je croyais aussi tout savoir. J'ai vite déchanté. Ma première réponse sur le forum Usenet comp.lang.c a été commentée d'un sévère (de mémoire)
    you should increase your level of expertise before pretending to answer...
    (Je vais essayer de retrouver la citation exacte...)

    Bref ça voulais dire
    commence par lire et apprendre
    . J'ai beaucoup lu lu et j'ai énormément appris !

    Autre citation lue sur ce forum
    Usenet needs to have a hard skin

  12. #12
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 605
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Enfin, pourquoi est-ce que scanf() est imposé ? Imposé par qui d'abord ?
    C'est une initiation en C que je prérare dans un cadre assez strict. On ne veut pas noyer les étudiants avec des fgets afin de privilégier l'algorithmie. Après cet apprentissage, ils vont vite passer à programmer (sans moi cette fois) des micro controleur en assembleur et un peu en C. Ceci dit, je m'impose de mettre dans mon sujet de TD toutes les remarques que j'entends ici qui vont dans le sens de celles que tu fais afin qu'ils sachent qu'on leur simplifie la vie et que ça pourrait générer des gros bufs dans un vrai programme.

    Citation Envoyé par Emmanuel Delahaye
    Montre l'ensemble du code qu'on y voit clair...
    Je ne vais pas donner la solution du TD avant d'avoir donné le sujet . Bon, voici la partie incriminée :
    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
     printf("\nQuatrième partie : demande d'intervalles\n");
     do
     {
      printf("Combien avons de notes entre i (largue) et j (strict) avec i<j . Donnez i et j.\n");
      do
      {
       printf("i = ");
       if (scanf("%d",&i)==0)
       {
        i=21;
        getchar();
       }
       if (i<0 || i>19)
        printf("Erreur dans la saisie de i : recommencez...");
      } while (i<0 || i>19);
      do
      {
       printf("i=%d, j = ",i);
       if (scanf("%d",&j)==0)
       {
        j=21;
        printf("Ici ?\n");
        getchar();
       }
       printf("i=%d, j = ",i);
       if (j<=i || j>20)
        printf("Erreur dans la saisie de j : recommencez...");
      } while (j<=i || j>20);
      printf("Il y a %d notes entre %d (largue) et %d (strict)\n",cbns[i]-cbns[j],i,j);
      //if (kbhit()) getchar();
      do
      {
       printf("Voulez-vous avoir un autre intervalle ? (o/n)\n");
       c=toupper(getchar());
      } while (c!='O' && c!='N');
     } while (c=='O');
    Comme j'ai mis le code presque complet, j'en profite pour faire 2 remarques :
    1) Mes collègues qui jouent avec des micro controleurs 8 bits aimeraient que je déclare i et j en unsigned char, dans ce cas l'affection de j avec scanf détruit i (le met à 0). Sur leur matériel, ça génère un gain de temps.
    2) Le getchar() quand j'ai scanf qui lit mal la donnée (mal formaté) est peut-être équivalente à mon problème... => toujours mettre getchar() après scanf ? Si je ne mettais pas le getchar(), le boucle devenait infinie !!

    nb : lien vers une explication de l'absence de kbhit ? Important pour argumenter mes collègues.

    nb nb : je suis de retour à 2 étoiles...

    nb nb nb :
    Citation Envoyé par miron
    Je suis désolé
    alors je vais arreter de repondre, puisque out ce que je dit ca a l'air detre des betises.
    Le tout est d'admettre ces faiblesses même quand on essaie d'aider les autres. Quand je trouve un étudiant plus féru que moi, je m'en sers, il aime ça et ça passe bien. Parfois il m'apprend même des choses.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  13. #13
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    SI c'estait possible de l'avoir en francais...

  14. #14
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 605
    Par défaut
    Citation Envoyé par miron
    SI c'estait possible de l'avoir en francais...
    Tu ne comprends pas quelle partie ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  15. #15
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par troumad
    C'est une initiation en C que je prérare dans un cadre assez strict. On ne veut pas noyer les étudiants avec des fgets afin de privilégier l'algorithmie.
    Et tu crois que de mettre des getchar() au hasard dans le code, ça va les aider ? Je vois 2 solutions
    • Soit tu leur apprends à construire leur fonctions de saisie
    • Soit tu leur donnes des fonctions de saisies toutes faites et validées (je peut t'aider pour ça)
    Le but étant de s'affranchir définitivement des problèmes de saisies pour ce concentrer sur l'essentiel. Bien sûr il faut leur expliquer que c'est du code non standard, mais portable (fournir les sources)

    Si tu ne fais pas ça, tu vas passer ton temps à debugger le saisies, et franchement il y a autre chose à faire (75% du traffic des forum C, en gros...) Alors si tu peux contribuer à la réduction de cette pollution, on te sera reconnaissant... Moi, je me bat pour ça depuis 5 ans... Je ne suis pas seul, heureusement...
    Après cet apprentissage, ils vont vite passer à programmer (sans moi cette fois) des micro controleur en assembleur et un peu en C. Ceci dit, je m'impose de mettre dans mon sujet de TD toutes les remarques que j'entends ici qui vont dans le sens de celles que tu fais afin qu'ils sachent qu'on leur simplifie la vie et que ça pourrait générer des gros bufs dans un vrai programme.

    Je ne vais pas donner la solution du TD avant d'avoir donné le sujet .
    Quelques lignes hors contexte suffisent...
    2) Le getchar() quand j'ai scanf qui lit mal la donnée (mal formaté) est peut-être équivalente à mon problème... => toujours mettre getchar() après scanf ? Si je ne mettais pas le getchar(), le boucle devenait infinie !!
    Supprime ce scanf() et ce getchar()...

    Fait comme le K&R. On y apprend à construire sa fonction de saisie à base de getchar(). Je trouve que pour une initiation au C, c'est exactement ce qu'il faut faire. scanf() c'est pour la centaine de gourous dans le monde qui le maitrise, ou pour les millions de bidouilleurs qui croient savoir utiliser scanf()...

    Les quelques milliers d'autres programmeurs avertis utilisent fgets() ou leur propre fonction de saisie :

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module IO

    un lien vers une explication de l'absence de kbhit ? Important pour argumenter mes collègues.
    C'est une extension de Borland C, c'est tout. MinGW et sa bibliothèque conio (interface <conio2.h>) proposent un portage pour la console win32.

    Pour unixoide, il y a un implémentation de kbhit() et getch() sur le site de "Développez" à base de termios....

  16. #16
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par troumad
    Tu ne comprends pas quelle partie ?
    Usenet needs to have a hard skin

  17. #17
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Pour unixoide, il y a un implémentation de kbhit() et getch() sur le site de "Développez" à base de termios....
    Sinon il y a ça :
    Comment simuler la fonction kbhit sous Unix ?

  18. #18
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 605
    Par défaut
    J'ai envoyé le lien à mes collègues, je prépare mon WE (même si un prof bosse pendant ses vacances, il profite tout de même des WE en famille
    J'ai donné rendez-vous demain matin aux Flamants Roses de la Camargue, il faut donc que tout soit prêt ce soir pour le départ

    A Mardi ! Et j'espère que j'aurais un retour de mes collègues d'ici là. J'aimerai bien que les contraintes qu'on se pose permettent de faire des programmes qui soient aussi compatibles Linux (je suis le seul à utiliser cet OS ).
    Je serais plutôt pour l'utilisation de fonctions propres toute faîtes : pourquoi elles n'existent pas déjà ?

    Encore merci
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  19. #19
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par miron
    Usenet needs to have a hard skin
    [Pour utiliser] Usenet, il faut avoir la peau dure.
    Autrement dit, il faut être prêt à s'en prendre plein la poire, savoir faire le tri, ne pas se vexer...

  20. #20
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par troumad
    J'aimerai bien que les contraintes qu'on se pose permettent de faire des programmes qui soient aussi compatibles Linux (je suis le seul à utiliser cet OS ).
    Les solutions que je propose sont évidemment indépendantes du système. C'est le B.A. BA...

Discussions similaires

  1. getch() et <conio>
    Par zulul dans le forum C
    Réponses: 17
    Dernier message: 25/05/2010, 12h08
  2. conio.h: No such file or directory
    Par débutant_en_C dans le forum C
    Réponses: 3
    Dernier message: 10/08/2006, 18h55
  3. menu déroulant avec conio
    Par lastrecrue dans le forum C
    Réponses: 9
    Dernier message: 01/07/2006, 14h14
  4. Mettre de la couleur avec conio
    Par pi-2r dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 28/06/2006, 17h13
  5. conio.c
    Par teto dans le forum C
    Réponses: 4
    Dernier message: 31/01/2004, 17h40

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