Que pensez vous de ce code - C++ - Programmation
Marsh Posté le 05-06-2003 à 09:22:41
ReplyMarsh Posté le 05-06-2003 à 09:26:29
forummp3 a écrit : ca fait joli le bleu |
C'est bien ce que je pensais, personne n'a pris 10 minutes pour lire ce code
Marsh Posté le 05-06-2003 à 09:27:21
polo021 a écrit : |
Scuse nous de bosser
Marsh Posté le 05-06-2003 à 09:29:25
LetoII nous fait croire qu'il bosse : |
ca te permettrai aussi d'apprendre la programmation des sockets
Marsh Posté le 05-06-2003 à 09:32:31
polo021 a écrit : |
J'ai des cours pour ça merci
Marsh Posté le 05-06-2003 à 13:58:56
Je sais pas en quel nivo tu es, mais koikilensoit ca me parrait bien ecrit. On peut chipoter un peu :
Code :
|
Y'a une fonction avec les CString (GetBuffer je crois, ou un truc comme ca) qui te renvoie un const char *, si ce n'est même un char * (je connais pas les MFC).
Si c'est un variable globale ton MessageToSend, faudrait la gercler. Si c'est un attribut de ta classe, un petit this-> devant lève l'ambiguite, ou alors respecte la notation MFC et renomme en m_MessageToSend;
Tu peux aussi éviter de caster des chaines en CString, genre ptr_bar->SetPaneText(0,CString("Connecting to gateway..." ));
ptr_bar->SetPaneText( 0, "Connecting to gateway..." ); doit suffir, ca allège un peu, et un allergique aux MFC t'en voudra pas. Après c'est selon chacun. On pourrait reprocher de mixer du code d'interface (vue) au milieu du code du coeur du programme (document), mais bon, dans ton cas ca passe (je fait référence au SetPaneText). Tu peux oublier ce point. Surtout si t'es nivo bac+2, car les MFC, c'est pas facile, et pour un premier stage, tu t'es appliqué à écrire quelque chose de lisible, et c'est très bien. Ca manque un peu de commentaires, et ton erreur a été de ne pas les écrire tout de suite. Un commentaire ca se fait tout de suite, jamais après.
Moi je suis attaché à cette règle : si on enlève le code, les commentaires doivent permettre de retrouver l'algo.
Voilou voilou pour ce que j'ai regardé. Mais moi je trouve que ca va. Continue comme ca.
Marsh Posté le 05-06-2003 à 14:08:57
HelloWorld a écrit : Je sais pas en quel nivo tu es, mais koikilensoit ca me parrait bien ecrit. On peut chipoter un peu :
|
merci beaucoup, je vais donc aller suivre tes quelques conseils.
MessageToSend est bien une une DM de ma classe. Mais je pensais qu'on utilisait la notatiom "m_" que pour les DM associees a un CEdit.
Et pour la methode getBuffer, j'ai essaye mais ca ne convient pas vraiment pour ce que je veux faire. GetBuffer il me semble renvoie un pointeur sur le CString alors que ce que je veux c'est une nouvelle chaine de caratere avec le contenu du CString.
Merci bcp pour tes encouragements ca fait du bien.
Marsh Posté le 05-06-2003 à 14:18:11
je vais peut etre quand meme continuer a utiliser
Code :
|
plutot que
Code :
|
parce que sinon ca devient encore plus casse tete de comprendre comment fonctionne le pgm
Marsh Posté le 05-06-2003 à 16:42:20
Citation : GetBuffer il me semble renvoie un pointeur sur le CString alors que ce que je veux c'est une nouvelle chaine de caratere avec le contenu du CString. |
Pas besoin dans ton cas.
Code :
|
Mais je comprends pas trop ... dans ton code, où tu fais en gros un GetBuffer à la main, où est-ce que tu places le '\0' final ?
Code :
|
Ca semble marcher ... a mon avis, tu as beaucoup beaucoup de chance. En effectuant le malloc, il doit initialiser la memoire à zéro, et comme il alloue un peu plus que ce que tu demandes (puissance de 2, + mode debug), tu t'en sors bien.
Mais ca, AMHA, c'est un bug, qui se manifestera par un plantage un des ces 4. A moins que j'ai raté un épisode.
Avec GetBuffer, plus de problèmes.
Cela m'amène à cette remarque : de même que malloc c'est du C et pas du C++, les char *, c'est fini.
Utilise des string, ou des CString dans ton cas. C'est fait pour, c'est plus fiable.
Perso, ta fonction sends, je transformerais même le char * msg en CString.
On peut toujours passer du char *, ca converti implicitement. Et plus besoin de caster ton code.
Enfin, pour le return sends(msg), je t'encourage à l'écrire ainsi. Ca fait partie des petites astuces qui surprennent la 1° fois, mais ensuite on y est habitué. Et même, ça fait mauvaise impression de laisser comme tu fais. T'en fait pas, tes profs sont habitués. Tu trouveras plein de sites gueulant plus ou moins sur du code où cet exemple est donné. C'est un classique, et contrairement à ce que tu crois, ça améliore la lisibilité.
PS : tu compiles en release ?
Marsh Posté le 05-06-2003 à 17:32:50
oui je compile en release. Ca change quoi en gros de compiler en release ou en debug?
Pour le getbuffer, j'essayerai MessageToSend.GetBuffer() demain car la j'ai un train a prendre.
Et pour le probleme du '\0' dans la fonction ou j'appele le sends je fais
Code :
|
donc ici ca ne pose pas de probleme pour le send mais c'est vrai que je ferais peut etre bien d'allouer une taille en plus et de mettre un '\0'.
Pour l'utilisation des string et CString a la place de char*, je verrai aussi ca demain mais je ne suis pas sur que
send(s,unCString,unCString.GetLength(),0);
enfin, je te dis quoi demain apres avoir essaye tout ca.
MERCI
Marsh Posté le 05-06-2003 à 17:42:54
HelloWorld a écrit : [quote]Cela m'amène à cette remarque : de même que malloc c'est du C et pas du C++, les char *, c'est fini. |
mouais... pour tout ce qui est sockets en tout cas, c'est du char* et pas autre chose, et pour cause, t'envoie pas forcement des "phrases", mais peut etre des données en hexa. alors oui les string sont modernes de nos jours, mais me vois mal mettre de l'hexa ds une string...
et sinon autre chose : y a un malloc avec le free qui correspond, mais plein de return possibles entre les 2, ca la fout mal, meme si les return n'arrivent jamais...
beaucoup plus grave par contre, surtout dans un code c++ :
aucun CONST !!!
Marsh Posté le 05-06-2003 à 18:39:00
polo021 a écrit : je vais peut etre quand meme continuer a utiliser
|
sinon t'as aussi :
Code :
|
Marsh Posté le 05-06-2003 à 18:43:53
Sinon, pour parler sérieusement, étant donné que tu sembles tester les cas d'erreurs dans ton programme (ce qui est bien), tu as oublié de tester le cas ou WSAStartup() renvoie un code d'erreur. Imagine que ton client n'ait pas Winsock 2 d'installé sur la machine, il ne saura jamais pourquoi ton programme ne fonctionne pas.
Rappel des erreurs retournées par WSAStartup() en cas d'initialisation échouée :
Citation : |
Marsh Posté le 05-06-2003 à 19:55:32
Harkonnen a écrit : Sinon, pour parler sérieusement, étant donné que tu sembles tester les cas d'erreurs dans ton programme (ce qui est bien), tu as oublié de tester le cas ou WSAStartup() renvoie un code d'erreur. Imagine que ton client n'ait pas Winsock 2 d'installé sur la machine, il ne saura jamais pourquoi ton programme ne fonctionne pas.
|
ben mon programm est fait pour tourner sur un PPC et je pense que ce sera toujours le meme. Donc pas de reel probleme de ce cote la mais je vais faire le test quand meme, ca fait plus serieux
Marsh Posté le 05-06-2003 à 21:57:26
Moi mon avis c que niveau nomage de fonctions et variable c crade (enfin pour moi )
De plus la recup des var in registry euh pareil un poil crade de faire ca comem ca.
Une macro fonctions Initialise par exemple qui recup valeur registry, set ses var interne en fonction et init WSA, tout ca en retournant un booleen par exemple (et idem pour le cleanup) ca serait un bon debut.
Enfin je chipote.
Marsh Posté le 06-06-2003 à 08:59:34
Sans le cast en CString :
ptr_bar->SetPaneText(0,"Message received" );
error C2664: 'SetPaneText' : cannot convert parameter 2 from 'char [17]' to 'const unsigned short *'
et
sends( MessageToSend.GetBuffer(0) ); ne fonctionne pas car il ne passe a ma fonction que le premier caractere donc je vais garder mon getbuffer fait a la main
pour les const, tu veux dire que je ferais mieux de passer le parametre de sends en const?
Et quels sont les return qui n'arrivent jamais d'apres toi?
Marsh Posté le 06-06-2003 à 09:39:39
SetPaneText prend un LPCTSTR (si c bien un CStatusBar ton ptr_bar et que ils ont pas changer entre aide vc6 et vc.net) donc normalement devrait marcher le "ton text" sans CString, je comprend pas trop pkoi compilo te gueule.
Pour ta fonction sends enfin vis a vis de passer comem l'indique Helloworld, euh je vois pas en koi avoir
Code :
|
pose pb, par contre c sur qu'il faut pas appeler la fonction par
Code :
|
comem tu l'indiques, mais un
Code :
|
suffit
Marsh Posté le 06-06-2003 à 09:42:48
VisualC++ a écrit : SetPaneText prend un LPCTSTR (si c bien un CStatusBar ton ptr_bar et que ils ont pas changer entre aide vc6 et vc.net) donc normalement devrait marcher le "ton text" sans CString, je comprend pas trop pkoi compilo te gueule.
|
oui mais la n'est pas le probleme. Je pourrais en effet passer la CString en param plutot qu'un char*
Je vois pas trop ou tu as vu que ca pouvait poser probleme. Tu as peut etre confondu MA fonction sendS et la fonction send des socket (pour cette fonction un char* est obligatoire)
Marsh Posté le 06-06-2003 à 09:46:18
Ben au dessus de mon message tu marques sends donc c ta fonction ou alros erreur
Marsh Posté le 06-06-2003 à 09:50:31
VisualC++ a écrit : Ben au dessus de mon message tu marques sends donc c ta fonction ou alros erreur |
oui d'accord mais la c'est juste un probleme de convertion de CString vers char* en fait.
Que je fasse la conversion avant l'appel a sends ou que je fasse la converstion dans sends ca revient au meme, le probleme de converstion est toujours la.
Mais merci pour l'idee, je vais peut etre passer une CString et faire la conversion dans sends, ca me permettre de diminuer la grandeur de mon code
EDIT : en fait non, c'est completement nulle cette idee de convertir dans sends puisque c'est l'objet de mon deuxieme topic. Faire une fonction qui converse
OU avais je la tete
http://forum.hardware.fr/forum2.ph [...] h=&subcat=
Marsh Posté le 06-06-2003 à 10:07:07
euh enfin pas lu l autre mais un mastring.GetBuffer(0) suivit d'un ReleaseBuffer() non
Car si c pour le socket send c comme ca que je fait et no soucis.
Marsh Posté le 06-06-2003 à 10:11:57
VisualC++ a écrit : euh enfin pas lu l autre mais un mastring.GetBuffer(0) suivit d'un ReleaseBuffer() non |
Donc d'apres toi, je fais un sends (CString) puis dans le sends, un send (socket,CString.GetBuffer(0),CString.GetLength(),0);
Ben je vais essayer ca
Marsh Posté le 06-06-2003 à 10:22:08
polo021 a écrit : |
Code :
|
beau plantage. Arret pur et simple du programme
Bon ben je sens que je vais garder mon programme pas tres oiptimise pour la converstion puis ben teanp pis
Marsh Posté le 06-06-2003 à 10:38:36
Oui mais bon tu dits toi mm GetLength() et a priori tu codes strlen(msg) ... honnetement tu es pas coherent ds les infos fournis ici (ni ds ton code il semble).
Marsh Posté le 06-06-2003 à 11:53:56
VisualC++ a écrit : Oui mais bon tu dits toi mm GetLength() et a priori tu codes strlen(msg) ... honnetement tu es pas coherent ds les infos fournis ici (ni ds ton code il semble). |
mais c'est bien vrai, rholala
EDIT : bah ca change pas grand chose en fait. Mon pgm envoie apparement mais je ne recois rien du serveur. Ce qui signifie que le serveur n'a pas recu la syntaxe attendue.
MErci quand meme
Marsh Posté le 06-06-2003 à 12:22:00
polo021 a écrit : |
garde tes char*... les gens ki te disent qu'il ne faut utiliser que des string et oublier définitivement les char* dès que ton prog est en c++, (a mon avis) ils ratent, en tout cas dès que ton prog utilise des fct en pur c, qui veulent donc des char* (comme les fct socket). ca veut un char*, bah utilise des char* si ca te facilite la vie.
autre chose : ca manque de const et de & ds le code d'en haut.
par ex, si 'source' ne sera pas modifiée, passe un const. et utilise une reference, sinon la string est copiée a l'appel de la fct.
le const de la fin est utile si ta méthode ne modifie aucun membre de ta classe.
Code :
|
un code avec des const, c'est toujours mieux, et plus lisible (tant kon en abuse pas qd meme)
Marsh Posté le 06-06-2003 à 12:41:14
Konar a écrit :
|
et qu'est ce que ca change qu'on passe une reference ou pas? Ca ne me derange pas que mon CString soit copie au passage par parametre.
Et puis ca fait pas un peu contraste de passer une reference a un const??
- reference : pour que ca puisse etre modifie ds la foncion,
- const : pour que ca ne soit pas modifie
Marsh Posté le 06-06-2003 à 12:45:19
polo021 a écrit : |
Un objet tu le passe tjrs par référence ou pointeur jamais par valeur (economie de place sur la pile). Et une référence contante ne peut être modifiée (d'où le const Truc& truc).
Marsh Posté le 06-06-2003 à 12:50:09
je vais mettre bool sends(const char*);
mais pas la methode en const car je modifie des DM dedans
Marsh Posté le 06-06-2003 à 14:47:20
Citation : SetPaneText prend un LPCTSTR (si c bien un CStatusBar ton ptr_bar et que ils ont pas changer entre aide vc6 et vc.net) donc normalement devrait marcher le "ton text" sans CString, je comprend pas trop pkoi compilo te gueule. |
C'est parce que c'est de l'UNICODE.
LPCTSTR, où T signifie soit ANSI, soit UNICODE.
C'est un poitn que j'avais pas mentionné vu que ça va chercher un peu plus loin déjà, mais apparement t'es en UNICODE.
Donc entoure toutes des chaînes dans ton code par la macro TEXT() (ou _T() aussi, koike des fois elle passe pas celle-là).
=> ptr_bar->SetPaneText(0, TEXT( "Message received" ) );
Cette macro ne fait rien en ANSI, et rajoute un L devant en UNICODE
(dans ton cas, il fait faire ptr_bar->SetPaneText(0, L"Message received" ); pour que ca marche, la macro TEXT le fait proprement).
Pour être parfait à ce sujet, faudrait mettre tes string dans une ressource ... afin d'être traduisible ... mais on chipote on chipote.
Dernier point, le sends, c'est comme ca :
send(s,unCString.GetBuffer(),unCString.GetLength(),0);
konar >
vi c'est du char *, parce que les socket c'est du C. Et quand je dit de se passer des char *, c'est pour des chaînes de caractères biensûr. Son exemple n'envoie pas d'"hexa", d'où ma remarque. Mais je pense qu'on se comprend.
La seule raison valable d'utiliser les char * pour des chaînes de caractères en C++ c'est quand on se trimballe des fonctions C (qu'il faudrait préfixer par :: pour faire bien
Code :
|
Mais les string sont bien concues et offrent une fonction pour cela, c_str pour les std::string et GetBuffer ici.
Marsh Posté le 06-06-2003 à 15:03:20
HelloWorld a écrit :
|
non non non, GetBuffer prends un parametre. Ca passe pas au compilo si je lui mets rien en parametre.
Peut etre parce que je suis en Microsoft Embedded Visual Tools 3.0
et je suis donc sur Pocket PC (windows CE) donc il me semble en effet que ce soit de l'UNICODE, je vais mettre TEXT alors
Citation : |
Marsh Posté le 06-06-2003 à 15:29:08
Non c pas a cause de ta version de VC, GetBuffer y a un parametre oui qq soit l'environnement de dev.
Marsh Posté le 05-06-2003 à 09:05:47
Bon alors voila...
j'aimerai inclure en annexe de mon rapport de stage 3 des fonctions essentielles de mon programme.
Mais d'abord j'aimerai avoir l'avis de specialistes pour savoir si ces fonctions sont biens ecrites, si elles sont comprehensibles, si je devrais ajouter des commentaires,...
Ces fonctions sont issues du pgm client.
En meme temps, ce poste peut servir aux gens qui veulent faire du client/serveur et qui se demandent comment ca fonctionne.
La premiere fonction est la fonction de "switch" qui permet de se connecter au serveur numero deux si le premier est inactif et inversement
La deuxieme fonction est l'envoi d'un message
La troisieme fonction est la fonction de reception d'un message
voila si vous avez lu tout, pourriez vous me donnez vos commentaires?
Message édité par polo021 le 05-06-2003 à 09:09:14