#1 Le 18/10/2008, à 15:11
- lebossejames
c: attente d'une touche et problème d'une fonction sous linux
bonjour,
j'ai essayé "getch" dans mon programme et cela ne fonctionne pas car je veux attendre que quelqun appuye sur une touche pour afficher le reste.
de plus, j'ai une fonction qui ne marche pas sous linux mais sous windows cela fonctionne.
http://dl.free.fr/nPMeuNlc4
merci.
Hors ligne
#2 Le 18/10/2008, à 16:03
- chcamier
Re : c: attente d'une touche et problème d'une fonction sous linux
Bonjour,
1 - Attente d'une touche :
getch() tout comme getchar() sont des fonctions de la bibliothèque "stdio". Elles ne gèrent pas la discipline de ligne. Si tu désires attendre l'appuie d'une touche quelconque, il faut d'abord ôter le mode "canonical" avant de lire le caractère en provenance du clavier.
Pour plus d'informations voire le manuel de "termios".
En attendant, un exemple de fonction "waitkey" que tu pourra utiliser sous Linux :
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
void waitkey(void)
{
char c;
struct termios tconf_org;
struct termios tconf_raw;
/* Récupération de la discipline de ligne */
if(tcgetattr(0, &tconf_org) == -1)
{
perror("tcgetattr");
return;
}
if(tcgetattr(0, &tconf_raw) == -1)
{
perror("tcgetattr");
return;
}
/*
* Modification de la dicipline de ligne.
* Sont oté les modes :
* - ECHO (affichage du caractère frappé),
* - ECHONL (Affichage des retours à la ligne),
* - ICANON (Mode canonique)
*/
tconf_raw.c_lflag &= ~(ECHO | ECHONL | ICANON);
if(tcsetattr(0, TCSANOW, &tconf_raw) == -1)
{
perror("tcsetattr");
return;
}
/* Lecture d'un caractere quelconque */
read(0, &c, 1);
/* Restoration de la discipline de ligne originale */
if(tcsetattr(0, TCSANOW, &tconf_org) == -1)
{
perror("tcsetattr");
return;
}
return;
}
int main(int ac, char *av)
{
printf("appuyez sur une touche pour continuer\n");
waitkey();
printf("OK\n");
return 0;
}
2 - La fonction :
Pour compiler ta fonction qui utilise la fonction "pow" de la bibliothèque mathématique, il faut déclarer cette dernière (-lm) lors de l'édition de liens.
A+
CC
Dernière modification par chcamier (Le 18/10/2008, à 16:04)
Hors ligne
#3 Le 18/10/2008, à 16:08
- lebossejames
Re : c: attente d'une touche et problème d'une fonction sous linux
j'ai fait -lm mais cela pose probleme quand meme.
Hors ligne
#4 Le 18/10/2008, à 16:08
- lebossejames
Re : c: attente d'une touche et problème d'une fonction sous linux
j'ai fait -lm mais cela pose probleme quand meme.
Hors ligne
#5 Le 18/10/2008, à 16:17
- chcamier
Re : c: attente d'une touche et problème d'une fonction sous linux
Désolé, j'ai cru que c'était à la compilation. Si c'est au moment de l'exécution, il est fort possible qu'il soit nécessaire de changer le :
fopen(NomImage, "rb")
par :
fopen(NomImage, "r")
Je ne suis pas certain que le problème vienne de là, je n'ai pas testé ta fonction. Si ce n'est pas la cas, j'aimerais avoir plus d'informations sur le dysfonctionnement.
CC
Hors ligne
#6 Le 18/10/2008, à 16:26
- lebossejames
Re : c: attente d'une touche et problème d'une fonction sous linux
il m'indique segmentation fault
Hors ligne
#7 Le 18/10/2008, à 16:27
- chcamier
Re : c: attente d'une touche et problème d'une fonction sous linux
Bon, j'ai commencé à analyser ton code. Quelques remarques :
tabcara=(char*)malloc(sizeof(char)) est équivalent à tabcara=(char*)malloc(1). Tu alloue donc un tableau de 1 caractères !
Il faudrait allouer ton tableau après avoir calculé ta variable "val" par un tabcara=(char*)malloc(val). Ce qui éviterait le SEGMENTATION FAULT.
CC
Hors ligne
#8 Le 18/10/2008, à 16:36
- lebossejames
Re : c: attente d'une touche et problème d'une fonction sous linux
c'est ça que j'ai fait
Hors ligne
#9 Le 18/10/2008, à 16:37
- lebossejames
Re : c: attente d'une touche et problème d'une fonction sous linux
pe tu supprimer le code source stp.
car je ne veut pas le voir.
Hors ligne
#10 Le 18/10/2008, à 16:41
- lebossejames
Re : c: attente d'une touche et problème d'une fonction sous linux
ça l'air de fonctionner
Hors ligne
#11 Le 18/10/2008, à 16:52
- lebossejames
Re : c: attente d'une touche et problème d'une fonction sous linux
merci mais cela pose toujours un autre problème car il y a tjs segmentation fault
Hors ligne
#12 Le 18/10/2008, à 17:02
- chcamier
Re : c: attente d'une touche et problème d'une fonction sous linux
Il apparaît toujours dans la fonction extraction ? Pour en être certain, lance ton programme sous gdb (il est préférable de le compiler avec l'option "-g" avant).
$ gdb fichier_programme
(gdb) run
Puis quand le programme plante, utiliser la commande "where" pour savoir où est le problème :
(gdb) where
Hors ligne
#13 Le 18/10/2008, à 17:14
- lebossejames
Re : c: attente d'une touche et problème d'une fonction sous linux
coucou��?p�4�JH��8�L�"S����� ���)�~8~8����88����������������������������8ü�����8� �������??ãð ÿÿÿü8ÿð ÿÿÿÿþ ü─øà ─øãð ü ÿÿÿÿÿü─øãÿÿÿÇÿÿü ñÿãÿÿü Àãð ü��8��q��p?�p���������~?���q�������8��������������8���q��p?�?����q��q ������ü�?�?����p����8��������� ─øãÿÿü��� þ� ÿÿÿñÇãÿÿü⎻ ÿÿü ÿð ü�~8�p���������~���������������� ÿÿü Ç⎻ ø à à Àðà─ÀñÇÿ à 8ð?ÿÿü· 8ãø øÿ · 8└)¥┐ áH⎻ · ãá¤P��8�q�p ÿø ÿÿüÿÿÿÿÿÿÿÿÿÿü�������������������� �����������������q���8�����8ÿð ÿÿÿÿð?ÿþü ⎻ ãþÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?ÿÿÿü ÿÿü Àãð ÿÿøø ãð8ÿð ─Àà� ü⎻ ãÿÿÿÿÿÿÿø ����� ÿÿÿÿÿÿÿÀü⎻ãð ÿÿÿÿÿÿð ÿÿÿÿþÿð ÿÿÿÿÿÿÿ
P⎼⎺±⎼▒└ ⎼␊␌␊␋┴␊␍ ⎽␋±┼▒┌ SIGSEGV, S␊±└␊┼├▒├␋⎺┼ °▒┤┌├.
0│␉7␊␉°79␉ ␋┼ ?? () °⎼⎺└ /┌␋␉/├┌⎽/␋686/␌└⎺┴/┌␋␉␌.⎽⎺.6
(±␍␉) ┬␊⎼␊
#0 0│␉7␊␉°79␉ ␋┼ ?? () °⎼⎺└ /┌␋␉/├┌⎽/␋686/␌└⎺┴/┌␋␉␌.⎽⎺.6
#1 0│␉7␊␌34°0 ␋┼ °⎼␊␊ () °⎼⎺└ /┌␋␉/├┌⎽/␋686/␌└⎺┴/┌␋␉␌.⎽⎺.6
#2 0│␉7␊▒␊3␊4 ␋┼ °␌┌⎺⎽␊ () °⎼⎺└ /┌␋␉/├┌⎽/␋686/␌└⎺┴/┌␋␉␌.⎽⎺.6
#3 0│08049130 ␋┼ ␊│├⎼▒␌├␋⎺┼ () ▒├ ⎽├␊±▒┼⎺_├␊│├␊⎽.␌:304
#4 0│080491␌6 ␋┼ └▒␋┼ () ▒├ ⎽├␊±▒┼⎺_├␊│├␊⎽.␌:324
(±␍␉)
Hors ligne
#14 Le 18/10/2008, à 17:14
- lebossejames
Re : c: attente d'une touche et problème d'une fonction sous linux
voici ce qui m'affiche
Hors ligne
#15 Le 18/10/2008, à 17:50
- chcamier
Re : c: attente d'une touche et problème d'une fonction sous linux
Apparemment, il y a un printf du foireux.
Il faut trouver une ligne du type :
printf("%s", buffer)
avec un buffer qui n'est pas un tableau de caractères terminé par un caractère NULL.
Les codes spéciaux sont le résultat d'un code émis qui met le terminal en mode caractères graphiques.
(généralement un caractère code 14 (^N)).
Dans ce cas, sans sortir de GDB, il suffit de tenter un "reset" (chercher dans les menus) du terminal et de lancer la commande where.
Hors ligne
#16 Le 18/10/2008, à 18:23
- lebossejames
Re : c: attente d'une touche et problème d'une fonction sous linux
#0 0xb7e1479b in ?? () from /lib/tls/i686/cmov/libc.so.6
#1 0xb7e184f0 in free () from /lib/tls/i686/cmov/libc.so.6
#2 0xb7e033e4 in fclose () from /lib/tls/i686/cmov/libc.so.6
#3 0x08049130 in extraction () at st.c:304
#4 0x080491c6 in main () at st.c:324
Hors ligne
#17 Le 18/10/2008, à 18:39
- chcamier
Re : c: attente d'une touche et problème d'une fonction sous linux
Premier point, en cas d'erreur d'ouverture de fichier (ligne du fopen), en cas d'erreur, il serait bien de sortir de la fonction "extraction" par un return :
if((f = fopen(NomImage, "rb"))==0)
{
printf("Erreur lors de l'ouverture de l'image....\n");
return;
}
Second point, il serait intéressant de tester les retours des appels à la fonction "fread". Normalement cette fonction retourne le nombre d'éléments effectivement lus. En cas d'erreur, retour valeur 0, afficher un message, fermer le fichier et sortir de la fonction "extraction".
CC
Dernière modification par chcamier (Le 18/10/2008, à 19:02)
Hors ligne
#18 Le 18/10/2008, à 18:55
- lebossejames
Re : c: attente d'une touche et problème d'une fonction sous linux
le return dans le if ne change rien.
Hors ligne