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 :

Valider avec certaines touches.


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut Valider avec certaines touches.
    Bonjour,

    Je vous explique mon problème. Je code un programme dans lequel je fais un menu de différentes actions, que l'utilisateur sélectionne en appuyant sur 1 ou 2 ou... puis sur ENTER

    Je me demande si il y a possibilité de valider sans appuyer sur ENTER ? J'ai rechercher sur le web, et les différentes méthodes que j'ai pu trouver ne m’amène a rien..

    Je retrouve souvent le getchar() mais il faut lui aussi le valider avec la toucher ENTER...

    J'aimerais faire en sorte que l'utilisateur sorte du menu en pressant n'importe qu'elle autre touche, je flaire une piste, mais tjs la validation de la saisie à faire avec ENTER...

    Je ne sais même pas si c'est faisable en C..

  2. #2
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Avec ce que met à notre disposition le standard, je ne penses pas que cela soit possible.

    Et même si tu voulais jouer avec setvbuf, tu aurais peut-être un terminal qui bufferise indépendamment de ta volonté (mais peut-être est-ce paramétrable avec les termios).

    Enfin, imagine la prise de tête si tu devais gérer les retours chariot (backspace) etc....

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonsoir,

    Peut être : int getch(void); // #include <conio.h>

    Description :
    Lit un caractère depuis le clavier, sans l'afficher à l'écran (et n'attend pas <Entrée> )

    ou

    int getche(void); // #include <conio.h>
    Description :
    Lit un caractère depuis le clavier, et l'affiche à l'écran (et n'attend pas <Entrée> )

  4. #4
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut
    salut !
    sous windows kbhit() dans conio.h.
    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
    // kbhit.c - from a microsoft example
     
    #include <conio.h>
     
    #include <stdio.h>
     
    int main( void )
     
    {
    int i = 0;
    clrscr();
    // Display message until key is pressed. 
    printf("bof");
    putchar(0x0D);
    putchar('|');
    putchar(0x0D);
    putchar('/');
    putchar(0x0D);
    putchar('-');
    putchar(0x0D);
    putchar('\\');
     
    while( !_kbhit() ){ 
    	putchar(0x0D);
    	printf("%d", i++);	
    }
     
    // Use _getch to throw key away.
     
    printf( "\nKey struck was '%c'\n", _getch() );
     
    }
    A+

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Visual 2010 me dit ceci: absence de ';' avant 'type' a la ligne du getch

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void main(){
    	printf("Presser n'imp");
    	int getch(void);
    	printf("TOTOTOTOTOTOTO");
    }
    Je ne voit pas ou j'ai pu en oublier une...

  6. #6
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Il ne faut pas mettre de void dans getch. "void" étant considéré comme un type (en fait l'absence de type), le compilateur attend un identificateur à la suite.

    Le "void" est éventuellement précisé dans le prototype de la fonction.

    EDIT : Comme précisé ci-dessous, il faut aussi enlever le "int".

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Même si je l'enlève il me dit tjs la même erreur lors de la compilation.

    En revanche le khbit() fonctionne très bien dans l'utilisation que je veut en faire pour le "Frapper une touche pour continuer". En revanche si je veut exclure quelque touche de cette fonction, je mettrait bien dans condition en plus dans ma boucle (voir code ci dessous) mais je sais pas trop comment récupérer la valeur de ma touche avant qu'il valide...
    L'exemple ci dessous est donné pour exclure la touche 1.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void main(){
    	printf("Presser n'imp\n");
    	while(!kbhit() && getchar()!='1'){}
    	printf("TOTOTOTOTOTOTO");

  8. #8
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut
    dans le corps de main : c'est un prototype de fonction !, pas un appel de fonction.

    A+

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Desolé ^^ Il faut que je mette un getch() au lieu du getchar(), sinon je suis encore obligé de validé..

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Il faut que je mette un getch() au lieu du getchar(), sinon je suis encore obligé de valider
    C'est ce qu'on essaye de dire.

    Donc en reprenant ton exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void main()
    {
    	printf("Presser n'imp");
    	getch();
    	printf("TOTOTOTOTOTOTO");
    }

  11. #11
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Dans le code de anacharsis, se trouve la fonction clrscr();
    Si je ne me trompe pas, celle ci efface l'ecran ?
    Je n'arrive pas à la mettre en oeuvre ^^

  12. #12
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Citation Envoyé par petitnul12 Voir le message
    la fonction clrscr(); Si je ne me trompe pas, celle ci efface l'ecran ?
    C'est exact.

    Citation Envoyé par petitnul12 Voir le message
    Je n'arrive pas à la mettre en oeuvre ^^
    Qu'est ce qui ne fonctionne pas : ne compile pas ? n'efface pas l'écran ?
    Le mieux est de joindre le code qui ne fonctionne pas pour qu'on puisse t'aider.

  13. #13
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Attention la lib conio et la fonction sleep ne sont pas du c standard et ne sont pas forcément implantées sur toutes les plateformes, ou du moins pas tout à fait de la même façon. Ci dessous un exemple "as is". Le sleep est nécessaire pour éviter de gaspiller des cycles machine inutiles pendant l'attente d'un appui touche.

    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
    #include <conio.h>
    #include <stdio.h>
     
    int main( void )
    {
        char car;
        while(1)
        {
            while(!kbhit())
            {
                /* le sleep qui va bien */
            }
            car = getch();
            if(car == 27)
            {
                break;
            }
            printf( "'%c' pressed\n", car);
        }
        return 0;
    }

  14. #14
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Citation Envoyé par BlueMonkey Voir le message
    C'est exact.


    Qu'est ce qui ne fonctionne pas : ne compile pas ? n'efface pas l'écran ?
    Le mieux est de joindre le code qui ne fonctionne pas pour qu'on puisse t'aider.
    Visual me dit; identificateur "clrscr" non défini

    J'ai lu que cette fonction n’était pas forcement standard, cela peut venir de la ?

  15. #15
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Bon a priori le clrscr() n'a pas l'air très facile à utiliser car il dépend de l'IDE et de tout un tas de choses ^^ Je lâche ça pour l'instant.

    J'ai donc commencer mon programme, j'ai défini une fonction pause() pour faire mes pauses, et celle ci est suivi par l'acquisition du nombre de joueur. Mais quand j'arrive dans l'acquisition du nombre de joueur, la touche sur laquelle j'avait appuyer pour sortir de mon pause() apparait avant que j'ai eu le temps de faire autre chose...

    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #include<conio.h>
     
     
    void clearbuffer(){
    	char c;
    	while(c=getchar() != '\n' && c != EOF){};
    }
     
     
    void pause(){
    	while(!kbhit()){}
    }
     
    int lanceur(){
    	srand(time(NULL));
    	return rand()%6+1;
    }
     
    void define_player(int *nbr_player){
    	int tmp;
    	printf("Combien de joueurs veulent participer ?  (Maximum: 5)\n");
    	scanf("%d", &tmp);
    	if(tmp>5){
    		printf("Entrez un nombre entre 1 et 5 !!");
    	} else {
    		tmp=*nbr_player;
    	}
    }
     
     
     
     
     
    void main(){
    	int nb_player; int *nbr_player; nbr_player=&nb_player;
    	// Edition du messages d'accueil
    	printf("Accueil pour l'exemple ^^\n");
    	pause();
    	printf("\\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    	define_player(nbr_player);
     
    }

  16. #16
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Citation Envoyé par petitnul12 Voir le message
    Bon a priori le clrscr() n'a pas l'air très facile à utiliser car il dépend de l'IDE
    Effectivement, clrscr() dépend du compilateur (fonctionne sous Borland, pas Visual).
    Sous visual, une solution est d'envoyer la commande système "cls".

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <windows.h>
    #include <conio.h>
    #include <stdio.h>
    
    int main(void)
    {
        printf("Appuie sur une touche, et l'écran s'efface.\n");
        getch();
        system("cls");
        printf("L'écran vient de s'effacer. Appuie sur une touche pour terminer.\n");
        getch();
        return 0;
    }
    Citation Envoyé par petitnul12 Voir le message
    J'ai défini une fonction pause() [...], et celle ci est suivi par l'acquisition du nombre de joueur.
    Mais quand j'arrive dans l'acquisition du nombre de joueur, la touche sur laquelle j'avais
    appuyé pour sortir de mon pause() apparait avant que j'ai eu le temps de faire autre chose...
    En effet, tu ne lis pas le caractère utilisé pour sortir de la pause.
    Donc il se retrouve dans le prochain scanf.

    Et ta fonction pause n'intègre pas le conseil de Pfeuh : utilisation du Sleep.

    Essaye avec avec la fonction pause ci-dessous.
    (ajoute #include<windows.h> pour la fonction Sleep(int ms))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void pause()
    {
    	while(!kbhit())  //attend la pression d'une touche
        {
            Sleep(10);    //rend la main à l'OS pendant 10 ms pour autre tâche ;)
        }
    
        getch();  // lit la touche appuyé pour sortir de la pause.
    }

  17. #17
    Membre confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Ok Ok ^^ Je commence à mieux capter tout le truc ^^ Excuser les erreurs évidentes, faut que ça rentre ^^

    Thanks !!

    Comment change t'on la balise en RESOLU ?

    Edit: J'ai trouvé =)

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

Discussions similaires

  1. [WD12] Validation avec la touche OK (entrée)
    Par bruce207 dans le forum WinDev
    Réponses: 2
    Dernier message: 04/01/2009, 18h11
  2. Valider un formulaire avec la touche entree
    Par djedie dans le forum ASP.NET
    Réponses: 5
    Dernier message: 29/03/2007, 10h38
  3. Réponses: 4
    Dernier message: 30/08/2006, 17h15
  4. valider formulaire avec la touche 'entrer'
    Par mikees dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 06/07/2006, 17h51
  5. Valider avec les touches du clavier
    Par pierrot67 dans le forum Bases de données
    Réponses: 8
    Dernier message: 17/02/2006, 08h22

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