recuperer une chaine tappee au clavier AVEC ESPACES [C,Curses,solaris] - C++ - Programmation
Marsh Posté le 30-09-2002 à 17:54:44
je sais pas, mais question à 2 balles:
est-ce qu'il y aurait pas une merde avec le tamponnage du clavier (genre le '\n' qui est jamais retiré du buffer ou un truc du genre) ?
vu qu'apparement d'après les docs ça utilise getch(), normalement le getch() est bloquant (s'il bloque pu...)
Marsh Posté le 30-09-2002 à 18:01:05
bjone a écrit a écrit : je sais pas, mais question à 2 balles: est-ce qu'il y aurait pas une merde avec le tamponnage du clavier (genre le '\n' qui est jamais retiré du buffer ou un truc du genre) ? vu qu'apparement d'après les docs ça utilise getch(), normalement le getch() est bloquant (s'il bloque pu...) |
Je pense aussi que c'est un des soucis...
Mais alors, comment tu veux passer outre dans ce cas ?
Au depart je pensais que c'etait ssh... ben oui mais non, vu que via ssh ma becane le fait bien, et la becane de test pour le prof non...
Et oui, dans la specif de getch(), c'est marque que c'est bloquant, c'est pour ca que je galere un max
Marsh Posté le 30-09-2002 à 18:28:03
R@NNIS a écrit a écrit : pk tu fais pas une sorte de scanf %s avec getch tout betement ? |
C'est possible, mais je pense que ca va faire le meme bordel nan ?
Vu que le wgetstr est base sur le getch...
Et encore pire, comment tu veux gerer ensuite les retour chariots style "oups j'ai fait une fote"...
Et ca y en a besoin
Marsh Posté le 30-09-2002 à 18:31:13
à la limite avant le wgetstr()
tu fait un:
while( getch() != '\n' );
ou un truc du genre....
si y'a de la merde dans le tampon ça permet de purger...
Marsh Posté le 30-09-2002 à 18:32:02
bjone a écrit a écrit : à la limite avant le wgetstr() tu fait un: while( getch() != '\n' ); ou un truc du genre.... si y'a de la merde dans le tampon ça permet de purger... |
Pas con je tente
Marsh Posté le 30-09-2002 à 18:33:30
un tout simplement un getch()
derrière le wgetstr()
au cas ou celui-ci laisserai le '\n' dans le tampon...
Marsh Posté le 30-09-2002 à 18:34:51
bjone a écrit a écrit : à la limite avant le wgetstr() tu fait un: while( getch() != '\n' ); ou un truc du genre.... si y'a de la merde dans le tampon ça permet de purger... |
Putain pas con du tout ca a marche
Me reste un probleme avec le focus maintenant... je sais pas pkoi mais ma typebar est tout en haut ...
Librairies de merde
Pourquoi de pourquoi de chez pourquoi
Marsh Posté le 30-09-2002 à 18:36:30
bjone a écrit a écrit : un tout simplement un getch() derrière le wgetstr() au cas ou celui-ci laisserai le '\n' dans le tampon... |
Y a un bordel de probleme de focus la ...
Marsh Posté le 30-09-2002 à 18:47:36
en fait, je tape maintenant tout en haut, dans la mauvaise fenetre, et quand j'appuire sur enter ca valide, mais pas la bonne...
du moins quand tu tapes elle est en haut de la fenetre de chat...
Et quand tu appuies sur ENTER, il prends la valeur de la barre ou tu tapes en bas... cad rien...
Comment on dit au curseur : Ecrit ici, pas en haut
Marsh Posté le 30-09-2002 à 18:51:25
ça le faisait pas avant le getch() ?
peut-être que le fait d'utiliser le getch() déplaçe quelque part la position du "curseur" ?
Marsh Posté le 30-09-2002 à 18:53:27
bjone a écrit a écrit : ça le faisait pas avant le getch() ? peut-être que le fait d'utiliser le getch() déplaçe quelque part la position du "curseur" ? |
avant le getch() ca partait en couille, carrement, alors...
En fait, je vais mieux m'expliquer.
Quand je tape au clavier, ca apparait a l'ORIGINE de la console, en haut a gauche.
Meme si le curseur est bouge juste avant dans la bonne fenetre.
Et quand je valide, ca va prendre la valeur de la bonne fenetre... cad rien.
Donc forcement ca part en couille
Comment on dit a curses que ce que l'user tape doit apparaitre la ou se trouve le curseur et pas a l'origine de la fenetre
c'est pas wmove
Marsh Posté le 30-09-2002 à 18:55:45
alors attention:
le while( getch() != '\n' );
peut faire que le while(1) soit bloqué tant que tu as pas tapé un truc avec entrée...
en gros est-ce que ce que tu tapes c'est bien le wgetstr() qui le prends et pas le " while( getch() != '\n' ); " ?
--- AUSSI:
(sans le bricolage du while(..);
est-ce que la première saisie marche et les suivantes partent en boucle infinie ?
si oui, alors:
Code :
|
devrait mieux marcher car à ce moment c'est le wgetstr() qui vire pas le '\n' (ce qui est bizarre si il passe par getch())
Marsh Posté le 30-09-2002 à 18:57:26
en gros peut-tu vérifier que tu envoyes bien ce que tu tapes ?
Marsh Posté le 30-09-2002 à 18:59:08
bjone a écrit a écrit : alors attention: le while( getch() != '\n' ); peut faire que le while(1) soit bloqué tant que tu as pas tapé un truc avec entrée... en gros est-ce que ce que tu tapes c'est bien le wgetstr() qui le prends et pas le " while( getch() != '\n' ); " ? --- AUSSI: (sans le bricolage du while(..); est-ce que la première saisie marche et les suivantes partent en boucle infinie ? si oui, alors:
|
Le probleme viens pas de la, le probleme viens que les caracteres tapes au clavier n'apparaissent pas au bon endroit, meme en mettant le curseur dessus...
Sinon, en faisant le code avec le getch apres le wgetstr, effectivement, ca marche pareil qu'avec le while..
mais le blem est que les caracteres sont pas au bon endroits
Marsh Posté le 30-09-2002 à 18:59:59
bjone a écrit a écrit : en gros peut-tu vérifier que tu envoyes bien ce que tu tapes ? |
Ouaip, j'ai verifie, et j'envoie des chaines vides pour l'instant, car le contenu de la fenetre ou je veux taper est vide...
Vu que les caracteres apparaissent pas au bon endroit
Marsh Posté le 30-09-2002 à 19:00:30
Je revies dans 30 min ( en priant pour que tu soie encore la bjone )
Marsh Posté le 30-09-2002 à 19:32:56
attends, ça veux dire qu'alors ce que tu tapes est consommé par le " while( getch() != '\n' ) ", le getch() derrière le wgetstr() devrait mieux marcher je pense...
la position d'affichage ne devrait pas changer ce que tu récupéres par ton datpack.message, normalement wgetstr() prends les caractères les uns après les autres, modifies le buffer et l'affichage, mais la position de l'affichage ne devrait pas influancer le contenu du buffer...
Marsh Posté le 30-09-2002 à 19:35:42
bjone a écrit a écrit : attends, ça veux dire qu'alors ce que tu tapes est consommé par le " while( getch() != '\n' ) ", le getch() derrière le wgetstr() devrait mieux marcher je pense... la position d'affichage ne devrait pas changer ce que tu récupéres par ton datpack.message, normalement wgetstr() prends les caractères les uns après les autres, modifies le buffer et l'affichage, mais la position de l'affichage ne devrait pas influancer le contenu du buffer... |
c'est ce que je fais maintenant et c'est exactement le meme probleme qu'avant...
Les caracteres tapes sont pas au bon endroit
Marsh Posté le 30-09-2002 à 19:37:45
normalement si la correction avec le getch() marche, tu devrais envoyer le message, quelque soit la position de l'affichage...
Marsh Posté le 30-09-2002 à 19:45:33
bjone a écrit a écrit : normalement si la correction avec le getch() marche, tu devrais envoyer le message, quelque soit la position de l'affichage... |
Ben ouai mais non
c bien ca le souci
Je fais un test et je te dis quoi...
Marsh Posté le 30-09-2002 à 19:52:08
bin si ça marche po c'est que la correction chie...
sinon tu peux ouvrir un fichier, et y logger ce que tu récupères dans le data.message...
Marsh Posté le 30-09-2002 à 19:53:27
oui ben non du tout du tout...
Marche VRAIMENT pas
Les caracteres tapes ne sont pas dans la bonne fenetre
Marsh Posté le 30-09-2002 à 19:54:19
bjone a écrit a écrit : bin si ça marche po c'est que la correction chie... sinon tu peux ouvrir un fichier, et y logger ce que tu récupères dans le data.message... |
Je l'affiche ( car l'affichage de string marche au moins)
Et nada, il affiche des chaines vides...
Marsh Posté le 30-09-2002 à 19:55:49
Il faudrait que quand je tape au clavier ca apparaisse dans la BONNE fenetre et le souci serait regle
Marsh Posté le 30-09-2002 à 19:56:09
en fait il faut po se soucier que l'affichage soit pas fait au bon endroit...
normalement ce que tu tapes va dans le buffer...
so ça y va po y'a po bon avec la gruge du getch(), ou que le problème est ailleurs...
Marsh Posté le 30-09-2002 à 19:57:26
ton buffer il est bien alloué ? (sur la pile, en global, ou par malloc ?)
edit: oui je suis con, il foit faire parti de la structure de datpack...
Marsh Posté le 30-09-2002 à 19:58:21
c qui est bizarre c'est que le code fonctionne parfaitement sous Linux c ça ?
Marsh Posté le 30-09-2002 à 20:03:08
bon déjà vo mieux utiliser wgetch(), plustôt que getch()...
Marsh Posté le 30-09-2002 à 20:07:41
bjone a écrit a écrit : c qui est bizarre c'est que le code fonctionne parfaitement sous Linux c ça ? |
Exactement...
Mais alors aprfaitement de chez parfaitement...
Marsh Posté le 30-09-2002 à 20:08:52
bjone a écrit a écrit : bon déjà vo mieux utiliser wgetch(), plustôt que getch()... |
HU direct ca tape au bon endroit
Ca avance deja pas mal
Je bidouille pour voir si ca peux aller mieux
Marsh Posté le 30-09-2002 à 20:11:29
alors :
Avec le while(wgetch(typebar)) avant de taper, ca tape bien le message comme sous linux, donc c'est cool.
Avec le wgetch() apres le wgetstr, a chaque caractere tape il envoie un message.
Donc, ca signifie que le wgetstr n'est PAS bloquant sous solaris, peu importe ce qu'on en dise...
Je vais essayer avec un wscanf...
Y a vraiment un souci...
EDIT ( Flood suckz)
Avec le wcanw ca marche deja bcp mieux...
Le probleme restant etant que si le thread affiche dans la fenetre en haut un truc, le curseur ira aussi... faut que je trouve le moyen de restaurer le curseur ( ptet qu'avec wprintw... je teste la)
Marsh Posté le 30-09-2002 à 20:32:43
oki sinon là:
http://nscp.upenn.edu/aix4.3html/l [...] /getch.htm
y'a ça:
Citation : |
donc ça pue le problème de configuration de terminal...
Marsh Posté le 30-09-2002 à 20:34:08
donc il semblerait que tout simplement tu sois en NODELAY, le wgetstr() récupérant un ERR de wgetch(), deviens non bloquant...
Marsh Posté le 30-09-2002 à 20:37:36
ok, mais la, ca amrche comme je le veux
Bon ok apres avoir affiche un message le curseur apparait a cote de la ligne affichee mais franchement, spagrave.
car des que tu continues a taper ca viens a la suite de ce que tu as tape avant l'affichage
Me reste un dernier test et c bon ^^
Marsh Posté le 30-09-2002 à 20:39:36
ET PAF dedans.
le wscanw ne gere pas les esapces.
par exemple, si je tape "salut toi" au clavier
ca apparait a l'ecran comme "saluttoi" ( dans la barre ou je tape).
Et quand je valide, dans la fenetre de chat, ca apparait en tant que "salut"
Vais jamais m'en sortir
Pourtant j'ai fait un wscanw(typebar, "%s\n", datpack.message);
Marsh Posté le 30-09-2002 à 20:43:05
la solution universelle je pense:
http://nscp.upenn.edu/aix4.3html/l [...] DF4067davi
Citation : |
à l'extérieur du while(1), et tu gardes le wgetstr();
Marsh Posté le 30-09-2002 à 17:30:00
MISE A JOUR :
L'ancien probleme est resolu, mais il m'en reste un de taille.
Que je fasse un wscanw ou un wgetnstr, j'ai beau essayer d'entrer une CHAINE DE CARACTERES, par exemple des MOTS SEPARES PAR DES ESPACES ( avouez c'est con), eh ben mon cul, il les affiche meme pas les espaces que je tape au clavier... il les ignore...
J'ai essaye, conformement au MAN sous solaris, de ne pas faire de wscanw de %s mais bien de wscanw avec un format entre crochets dedans, par exemple [a-zA-Z] mais je me mange une segmentation fault.
Comment on fait, pitie
Je sature, ca fait 20 heures que je suis dessus
Ancien post :
Je suis dans la merde
Je vous epxlique le probleme :
J'ai du faire, pour un projet, une sorte de client IRC en mode texte sous linux/solaris etc, en C.
Donc, pour que ce soit + simple, je me suis dit que j'allais copier tous les autres : Faire une barre en bas ou l'utilisateur tape son message, et une grande fenetre au dessus ou tout apparait.
Jusque la, pas de souci.
J'ai donc programme ca sur mon linux a moi, une Debian sid mise a jour recemment.
Ca marche parfaitement, des qu'un message arrive il apparait dans la fenetre au dessus, des que l'utilisateur tape son message dans la barre en bas, et qu'il valide via enter, le message est envoye au server... bref, tout est pour le mieux dans le meilleur des mondes.
Arrive le moment ou je teste sur les machines sur lesquelles seront evalues les programmes.
Ces machines tournent sous SOLARIS.
Et c'est la que le gros souci apparait :
Ca par en boucle
En fait, la fonction que j'utilise pour avoir ce que l'utilisateur tape dans la barre du bas devient "non-bloquante"
En gros, au lieu d'attendre que l'utilisateur aie tape son messae et appuye sur ENTER, elle va directement prendre le contenu et continuer l'execution.
Voici le code :
Le souci est au niveau de la premiere ligne du while, "wgetstr":
-Sur ma debian elle attends que l'utilisateur aie valide son message
-Sur solaris ( meme versions de lib, j'ai verifie) elle prends le contenu sans se soucier de ce que l'utilisateur fait... elle attends rien quoi
Donc en gros, si vous pouviez :
-Me dire si il y a une autre fonction faisant l'equivalent d'un "scanf" dans une fenetre sous curses que wgetstr
-Comment regler le probleme en ajoutant un truc a wgetstr
Ca m'aiderai enormement
Please, j'ai passe 10 heures sur ce probleme sans succes, et le projet est pour tres bientot
Message édité par Tetedeiench le 01-10-2002 à 04:43:50
---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !