Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

[Résolu] [C] Interrompre une fonction en appuyant sur une touche


PaTaToR

Messages recommandés

Bonsoir à tous,

Comme le dit le titre du topic, je cherche une fonction (qui fonctionne sous linux) qui attendrait que je presse une touche sans perturber le déroulement du programme. J'aimerais que au moment où je presse la touche, je puisse effectuer une action (sortir d'une boucle en l'occurence).

 

Est ce qu'une telle fonction existe ? :P

 

Merci d'avance.

Modifié par PaTaToR
Lien vers le commentaire
Partager sur d’autres sites

Bonsoir à tous,

Comme le dit le titre du topic, je cherche une fonction (qui fonctionne sous linux) qui attendrait que je presse une touche sans perturber le déroulement du programme. J'aimerais que au moment où je presse la touche, je puisse effectuer une action (sortir d'une boucle en l'occurence).

 

Est ce qu'une telle fonction existe ? :P

 

Merci d'avance.

 

bonsoir,

 

je pense que l'utilisation des threads est la meilleure méthode (PThreads)... après je n'en vois pas d'autre.

Exemple concret sur linux kheops

 

++

Modifié par 3psilon
Lien vers le commentaire
Partager sur d’autres sites

Salut,

tu peux essayer ça,

 

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int i=1;
char a;
do   /* boucle infinie */
{
a=getchar(); /* L'appui de x */
if(a=='x')	 /* met fin à la boucle */
 break; 
} 
while(i!=0);

}

 

++

 

EDIT: euh j'avais pas vu "qui fonctionne sous linux", je sais pas du tout si ça fonctionne sous linux (je connais pas encore le pinguin ^^).

Modifié par odSen
Lien vers le commentaire
Partager sur d’autres sites

bonsoir,

 

je pense que l'utilisation des threads est la meilleure méthode (PThreads)... après je n'en vois pas d'autre.

Exemple concret sur linux kheops

 

++

 

 

Oula, c'est un peu compliqué pour ce que je veux faire.

Je débute la prog en C.

Ce que je veux faire, c'est juste un petit jeu de la vie. La solution que tu me proposes est bcp trop compliquée pour moi.

Je pensais plutot à une fonction toute faite (genre getchar) mais qui ne bloque pas l'execution en l'attente d'une valeur.

 

A propos de getchar, il me semble que son utilisation bloque le programme tant qu'on appuie pas sur une touche, mais bon, je vais retester.

 

EDIT : je viens de vérifier et getchar bloque bien l'exécution du programme.

Modifié par PaTaToR
Lien vers le commentaire
Partager sur d’autres sites

Getchar attend une valeur saisie par l'utilisateur,

cela vas donc bloquer l'exécution du programme jusqu'a ce que la fonction recoive ce caractére.

 

Je ne connaissais pas getchar_unlocked(), mais apparement c'est la même chose (a confirmer)

 

Pour ton problème, si tu ne veux pas utiliser les threads

(qui solutionnerais ton problème : puisque exécution dans diffèrents espace mémoire),

tu peux tenter de voir la gestion des évenements ss linux, mais la je pourrais pas aider, connais pas ^^

 

bon courage

Lien vers le commentaire
Partager sur d’autres sites

Euh, j'ai fait des recherches, mais j'ai pas vraiment compris à quoi servait fread(stdin).

Ca sert à lire un nombre d'octet dans un fichier ? (ici sur le clavier ?)

 

 

Par contre, j'ai trouvé une autre solution sur un forum écrite par Taz.

Je met le code qui suit dans un fichier que j'apelle press.h, et j'inclue ce fichier dans mon code comme n'importe quelle biblio. Aprés je peux utiliser comme je veux press() qui me renvoie un char quand je tape qque chose mais ne bloque pas le prog.

 

#include <stdio.h> 
#include <string.h> 

#include <termios.h> 
#include <unistd.h> 


static struct termios configuration_initiale; 
static struct termios configuration_brute; 

static void initialisation_configuration_clavier(); 
static void initialisation_clavier(); 
static void restauration_clavier(); 


int press() 
{ 
 int c; 

 /* on bascule */ 
 initialisation_clavier();  

 c = getchar(); 

 /* retour au mode normal */ 
 restauration_clavier(); 

 return c; 
} 


/* Gestion du clavier en mode brut */ 


static void initialisation_configuration_clavier() 
{ 
 static char is_init=0;   

 if(!is_init) 
{ 
  is_init = 1; 

  tcgetattr(STDIN_FILENO, &configuration_initiale); 

  configuration_brute = configuration_initiale; 

  cfmakeraw(&configuration_brute); 
  configuration_brute.c_cc[VMIN]  = 0; 
  configuration_brute.c_cc[VTIME] = 0; 
} 
} 

static void initialisation_clavier() 
{ 
 initialisation_configuration_clavier();   
 tcsetattr(STDIN_FILENO, TCSANOW, &configuration_brute); 
} 

static void restauration_clavier() 
{ 
 tcsetattr(STDIN_FILENO, TCSANOW, &configuration_initiale); 
}

Modifié par PaTaToR
Lien vers le commentaire
Partager sur d’autres sites

Effectivement, en passant le terminal en mode raw lors de la lecture de l'entrée standard, ça marche...

Pour info, stdin c'est le descripteur de fichier qui représente l'entrée standard (ce que le terminal reçoit du clavier) et ça se manipule comme n'importe quel fichier.

 

Au fait, appeler ce fichier press.h et l'inclure (par un #include) dans tes sources, c'est mal. Tu vas compiler autant de copies des fonctions press(), initialisation_configuration_clavier(), initialisation_clavier() et restauration_clavier() que tu vas avoir de fichiers compilés.

Tu devrais mettre les protos de ces fonctions dans un "vrai" .h et compiler un .c qui le contiendra une bonne fois pour toutes. Il suffira d'ajouter le .o correspondant lors du linkage...

Lien vers le commentaire
Partager sur d’autres sites

Au fait, appeler ce fichier press.h et l'inclure (par un #include) dans tes sources, c'est mal. Tu vas compiler autant de copies des fonctions press(), initialisation_configuration_clavier(), initialisation_clavier() et restauration_clavier() que tu vas avoir de fichiers compilés.

Tu devrais mettre les protos de ces fonctions dans un "vrai" .h et compiler un .c qui le contiendra une bonne fois pour toutes. Il suffira d'ajouter le .o correspondant lors du linkage...

 

 

Ah, c'est mal ?

Bon ben je vais changer.

Je capte pas tout ce que tu dis. A mon avis, je trouverais tout ça dans le dernier chaapitre de mon cours qui s'apelle "Introduction à la compilation" mais vu que je dois rendre mon projet avant d'avoir eu la fin du cours...

 

Donc ce que tu me dit c'est de compiler mon fichier press.h (renommé pour le coup press.c) en faisant un "gcc -c press.c"

Puis de compiler mon fichier principal dans lequel j'aurais viré le #include "press.h" avec un "gcc -c monfichier.c"

Le linkage, c'est qunad je fais un "gcc -o" c'est ça ?

Comment je fais ça ? "gcc -o prog press.c monfichier.c" ? :P

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...