Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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