[C,Curses,solaris]recuperer une chaine tappee au clavier AVEC ESPACES

recuperer une chaine tappee au clavier AVEC ESPACES [C,Curses,solaris] - C++ - Programmation

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 :cry:
 
Je sature, ca fait 20 heures que je suis dessus :cry: :cry:

 
 
 
 
 
 
 
 
 
 
 
 
Ancien post :
 
Je suis dans la merde :cry:
 
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 :
 

Code :
  1. while(1)
  2.         {
  3.           wgetstr(typebar,datpack.message);
  4.           wclear(typebar);
  5.           datpack.packet_ID = 151;
  6.           if(strncmp(datpack.message,"/quit",5)==0)
  7.             {
  8.               datpack.packet_ID = 161;
  9.               if (sendto(sockfd, &datpack , sizeof(data_packet), 0,
  10.                          (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) {
  11.                 perror("sendto" );
  12.                 exit(1);
  13.               }
  14.               delwin(chatbar);
  15.               delwin(typebar);
  16.               endwin();
  17.               return 0;
  18.             }
  19.           if (sendto(sockfd, &datpack , sizeof(data_packet), 0,
  20.                      (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) {
  21.             perror("sendto" );
  22.             exit(1);
  23.           }
  24.         }


 
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 :sweat:


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 !
Reply

Marsh Posté le 30-09-2002 à 17:30:00   

Reply

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...)

Reply

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 :/


---------------
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 !
Reply

Marsh Posté le 30-09-2002 à 18:13:52    

pk tu fais pas une sorte de scanf %s avec getch tout betement ?
 


---------------
Mes News
Reply

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 :cry:
 
:cry:
 
:/


---------------
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 !
Reply

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...

Reply

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


---------------
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 !
Reply

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...

Reply

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 :D
 
Me reste un probleme avec le focus maintenant... je sais pas pkoi mais ma typebar est tout en haut ...
 
:??:
 
Librairies de merde :cry:
 
Pourquoi de pourquoi de chez pourquoi :cry:


---------------
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 !
Reply

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 ...
 
:??:


---------------
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 !
Reply

Marsh Posté le 30-09-2002 à 18:36:30   

Reply

Marsh Posté le 30-09-2002 à 18:47:29    

alors là........
 
je sais po du tout du tout...

Reply

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 :??:


Message édité par Tetedeiench le 30-09-2002 à 18:50:45

---------------
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 !
Reply

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" ?

Reply

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 :/


Message édité par Tetedeiench le 30-09-2002 à 18:54:06

---------------
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 !
Reply

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 :
  1. ....
  2. wgetstr(...);
  3. getch();
  4. ....


 
devrait mieux marcher car à ce moment c'est le wgetstr() qui vire pas le '\n' (ce qui est bizarre si il passe par getch())


Message édité par bjone le 30-09-2002 à 18:56:45
Reply

Marsh Posté le 30-09-2002 à 18:57:26    

en gros peut-tu vérifier que tu envoyes bien ce que tu tapes ?

Reply

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:
 

Code :
  1. ....
  2. wgetstr(...);
  3. getch();
  4. ....


 
devrait mieux marcher car à ce moment c'est le wgetstr() qui vire pas le '\n' (ce qui est bizarre si il passe par getch())




 
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 :cry:
 


---------------
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 !
Reply

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 :sweat:


---------------
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 !
Reply

Marsh Posté le 30-09-2002 à 19:00:30    

Je revies dans 30 min ( en priant pour que tu soie encore la bjone :sweat: )


---------------
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 !
Reply

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...


Message édité par bjone le 30-09-2002 à 19:35:10
Reply

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 :/


---------------
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 !
Reply

Marsh Posté le 30-09-2002 à 19:36:44    

tu as mis un while( ... );
ou juste un getch() ?

Reply

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...

Reply

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...


---------------
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 !
Reply

Marsh Posté le 30-09-2002 à 19:52:08    

bin si ça marche po c'est que la correction chie... :D
 
sinon tu peux ouvrir un fichier, et y logger ce que tu récupères dans le data.message...

Reply

Marsh Posté le 30-09-2002 à 19:53:27    

oui ben non du tout du tout...
 
Marche VRAIMENT pas :cry:
 
Les caracteres tapes ne sont pas dans la bonne fenetre :/


---------------
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 !
Reply

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... :D
 
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... :/


---------------
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 !
Reply

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 :/


---------------
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 !
Reply

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...  [:spamafote]

Reply

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...


Message édité par bjone le 30-09-2002 à 19:59:41
Reply

Marsh Posté le 30-09-2002 à 19:58:21    

c qui est bizarre c'est que le code fonctionne parfaitement sous Linux c ça ?

Reply

Marsh Posté le 30-09-2002 à 20:03:08    

bon déjà vo mieux utiliser wgetch(), plustôt que getch()...

Reply

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...


---------------
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 !
Reply

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 :eek:
 
Ca avance deja pas mal :love:
 
Je bidouille pour voir si ca peux aller mieux ;)


---------------
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 !
Reply

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)


Message édité par Tetedeiench le 30-09-2002 à 20:20:36

---------------
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 !
Reply

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 :


The Importance of Terminal Modes
The output of the getch subroutines is, in part, determined by the mode of the terminal. The following describes the action of the getch subroutines in each type of terminal mode:
 
Mode Action of getch Subroutines  
NODELAY Returns a value of ERR if there is no input waiting.  
DELAY Halts execution until the system passes text through the program. If CBREAK mode is also set, the program stops after receiving one character. If NOCBREAK mode is set, the getch subroutine stops reading after the first new line character.  
HALF-DELAY Halts execution until a character is typed or a specified time out is reached. If echo is set, the character is also echoed to the window.  
 
Note: When using the getch subroutines do not set both the NOCBREAK mode and the ECHO mode at the same time. This can cause undesirable results depending on the state of the tty driver when each character is typed.


 
donc ça pue le problème de configuration de terminal...

Reply

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...

Reply

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 ^^


---------------
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 !
Reply

Marsh Posté le 30-09-2002 à 20:39:36    

ET PAF dedans.
 
le wscanw ne gere pas les esapces.
 
:cry:
 
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"
 
:cry:
 
Vais jamais m'en sortir :/
 
Pourtant j'ai fait un wscanw(typebar, "%s\n", datpack.message);


---------------
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 !
Reply

Marsh Posté le 30-09-2002 à 20:43:05    

la solution universelle je pense:
 
http://nscp.upenn.edu/aix4.3html/l [...] DF4067davi
 

Citation :


nodelay( typebar, false );


 
à l'extérieur du while(1), et tu gardes le wgetstr();

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed