URGENT ! Fin de développement d'application C++ avec MFC

URGENT ! Fin de développement d'application C++ avec MFC - C++ - Programmation

Marsh Posté le 12-06-2014 à 20:21:01    

Bonsoir à tous !
 
Je vous écris en urgence, demain soir à 17h mon programme doit être terminé (s'il n'est pas terminé, je resterais en vie bien sur mais ça va être gênant pour passer mon oral).
 
J'ai un programme qui me permet de récupérer le poids d'une balance en RS232 ainsi qu'une étiqueteuse qui me permet d'imprimer des étiquettes avec nom du produit, prix et code-barres ! Jusque là, tout va bien !
Mais je me heurte à 2 difficultés :
 
La première... J'ai un "unsigned char tab2" qui récupère une chaine de caractère comme "1000 g" (le poids que m'envoie la balance). Travaillant en MFC, je récupère ce tableau dans une variable CString "m_tab2". Tout va bien ! Sauf que j'ai besoin de cette valeur en kg et non en g ! Je devrais donc diviser ce poids par 1000. Mais impossible d'y arriver (très certainement à cause du "g" en fin de chaine). L'idée serait peut être de transformer ce Cstring en int, pour moi, le int prendrait juste le numéro correspondant au poids et supprimerait le "g". De là, je pourrait diviser cette variable par 1000. Je ne sais pas comment faire... Quelqu'un a une idée ?
 
Le 2ème problème, j'ai une chaine de caractère dans un tableau "buffer" ! La chaine c'est quelque chose comme "1,carottes,2,5.5,3,9856478563214". L'idée, ce serait de découper cette chaine ! A chaque fois que l'on rencontre une virgule, ce qu'il a lu avant va dans un premier tableau. Et ainsi de suite ! Ce qui ferait (par exemple) : tab1 avec le "1" à l'intérieur, tab2 avec "carotte" à l'intérieur...ect... Vous voyez ?
 
Peut être qu'entre maintenant et 17h demain j'aurais trouvé la solution mais...rien n'est sur ! Alors pour toute l'aide que vous pourrez m'apporter : Merci beaucoup d'avance !
 
Bonne soirée :)


---------------
Nicolas H.
Reply

Marsh Posté le 12-06-2014 à 20:21:01   

Reply

Marsh Posté le 12-06-2014 à 20:59:58    

Bon pour ta première question, il suffit d'être malin: Les fonctions convertissant une chaîne (ici une CString, je connais mal l'API Windows mais ça existe forcément) en int existent déjà. D'ici là ton seul boulot est de te débrouiller pour supprimer l'unité.
 
Pour cela il te suffit de programmer une fonction qui détecte le nombre de chiffres composant ta valeur (par exemple, si c'est 1000, ça veut dire que ta chaîne possède 4 chiffres). Ensuite tu utilises la méthode Left des CString (documentée ici: http://msdn.microsoft.com/en-US/library/ms928948.aspx ) afin d'extraire la partie de la chaîne qui t'intéresse.
 
A partir de cette nouvelle chaîne (qui ne contient du coup plus aucune unité) tu peux parfaitement exécuter une fonction telle que atoi pour la convertir en int (penser à utiliser la méthode GetString() de la CString afin d'obtenir une chaîne sous format char *, atoi ne prenant pas en charge les CString directement)

 
EDIT: Je viens de me documenter, à priori strtol s'arrête tout seul au premier caractère non chiffre de la chaîne, du coup strtol(taChaine.GetString(), NULL, 10); devrait fonctionner :o
 
Pour ta seconde question, utilise strtok: Cette fonction te permet de faire exactement ce que tu recherches. Il te restera à allouer un tableau 2D qui stockera les résultats renvoyés par les appels successifs à cette fonction.


Message édité par WiiDS le 12-06-2014 à 21:14:00

---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 12-06-2014 à 21:56:02    

Bonsoir :)
Merci pour ta réponse !
 
N'étant pas très doué en C++, tes explications me font me poser une nouvelle question : pour la fonction strtol, si je fais par exemple strtol(m_tab2.GetString(), NULL, 10); (où m_tab2 est ma variable CString contenant qqch comme "1000 g" ), la nouvelle chaîne sans le " g", elle va s'enregistrer par dessus l'ancienne ? Dans m_tab2 ou il faut que je lui donne une autre destination (tableau, variable...ect...) ?
Et si je peux me permettre... Il correspond à quoi le "10" dans les paramètres de la fonction ?
 
Je vais voir comment utiliser strtok ;) Merci ;)

Reply

Marsh Posté le 12-06-2014 à 22:04:31    

si mes souvenirs sont bons, strtol te renvoie un long int ou un int donc il te suffie de faire une petite variable intermédiaire :D

Reply

Marsh Posté le 12-06-2014 à 22:10:50    

Mais il faut que je le renseigne à la fonction non ? Comment elle va savoir qu'il faut ranger cette nouvelle chaine dans l'autre variable ?

Reply

Marsh Posté le 13-06-2014 à 10:45:46    

nicoalas78 a écrit :

Bonsoir :)
Merci pour ta réponse !
 
N'étant pas très doué en C++, tes explications me font me poser une nouvelle question : pour la fonction strtol, si je fais par exemple strtol(m_tab2.GetString(), NULL, 10); (où m_tab2 est ma variable CString contenant qqch comme "1000 g" ), la nouvelle chaîne sans le " g", elle va s'enregistrer par dessus l'ancienne ? Dans m_tab2 ou il faut que je lui donne une autre destination (tableau, variable...ect...) ?
Et si je peux me permettre... Il correspond à quoi le "10" dans les paramètres de la fonction ?
 
Je vais voir comment utiliser strtok ;) Merci ;)


strtol renvoie un entier, sur lequel tu pourras travailler (faire des divisions dessus par exemple). Du coup pour récupérer la valeur faudra que tu fasses un truc genre int monPoids = strtol(m_tab2.GetString(), NULL, 10);
 
Et le 10 dans les paramètres de la fonction spécifie la base du nombre que tu essayes de convertir. Ici pas de surprises, tu travailles en base décimale, donc 10.


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 13-06-2014 à 10:48:39    

Merci beaucoup :) Je vais tester ça tout de suite !!
 
Euh...petit message d'erreur ci-dessous :/
 
error C2039: 'GetString' : is not a member of 'CString'


---------------
Nicolas H.
Reply

Marsh Posté le 13-06-2014 à 11:26:13    

Désolé pour le double post...
 
Le problème a l'air d'être résolu !
J'ai fait ça :
 
int monPoids = strtol(m_poids, NULL, 10);
poids=monPoids/1000;
 
Ça parait logique, aucune erreur, pas de bug, pas de crash de mon application... C'est OK :)
 
Par contre, pour mon deuxième problème, avec la fonction strtok comme tu m'as dit WiiDS, j'ai du mal à comprendre...

Reply

Marsh Posté le 13-06-2014 à 12:18:36    

strtok, c'est pour couper ta chaine selon des délimiteurs précis.
C'est une question qu'on voit revenir souvent, et vu qu'on n'est plus à l'age de pierre, on a des solutions plus élégantes que strtok pour le faire : http://forum.hardware.fr/hfr/Progr [...] m#t2220777


---------------
last.fm
Reply

Marsh Posté le 13-06-2014 à 13:42:44    

Je pense que tu parles de ça :

Code :
  1. #include <iostream>
  2.     #include <sstream>
  3.     #include <string>
  4.     #include <vector>
  5.     #include <iterator>
  6.     #include <locale>
  7.     using namespace std;
  8.     struct delim : ctype<char> {
  9.       delim(char c) : ctype<char>(get_table(c)) {}
  10.       static mask const* get_table(char c)
  11.       {
  12.         static mask rc[table_size];
  13.         rc[c]  = ctype_base::space;
  14.         rc['\n'] = ctype_base::space;
  15.         return &rc[0];
  16.       }
  17.     };
  18.     int main ()
  19.     {
  20.         istringstream iss("hello#world!#etc and etc..." );
  21.         // changement de facette pour délimiter
  22.         iss.imbue(locale(iss.getloc(), new delim('#')));
  23.         // split en tokens
  24.         vector<string> tokens;
  25.         copy(istream_iterator<string>(iss),
  26.              istream_iterator<string>(),
  27.              back_inserter<vector<string> >(tokens));
  28.         // imprimons le contenu du vector
  29.         copy(tokens.begin(), tokens.end(), ostream_iterator<string>(cout, "\n" ));     
  30.         return 0;
  31.     }


 
C'est horrible, je n'y comprend quasiment rien...


---------------
Nicolas H.
Reply

Marsh Posté le 13-06-2014 à 13:42:44   

Reply

Marsh Posté le 13-06-2014 à 19:22:26    

theshockwave a écrit :

strtok, c'est pour couper ta chaine selon des délimiteurs précis.
C'est une question qu'on voit revenir souvent, et vu qu'on n'est plus à l'age de pierre, on a des solutions plus élégantes que strtok pour le faire : http://forum.hardware.fr/hfr/Progr [...] m#t2220777


Ah oui c'est du C++ [:prozac]


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 13-06-2014 à 22:04:17    

C'est bon ! Problème réglé :)
 

Code :
  1. NextPosition=buffer;
  2. for(i=0;i<2;i++)  //Recherche de la 2eme virgule=> 3ème champ de la réponse
  3. {
  4. NextPosition=strchr(NextPosition,',');
  5. NextPosition++;
  6. }
  7. for(i=0;*(NextPosition+i)!=',';i++)
  8. PrixKg[i]=*(NextPosition+i);
  9. PrixKg[i]='\0';


Message édité par nicoalas78 le 13-06-2014 à 22:04:42

---------------
Nicolas H.
Reply

Sujets relatifs:

Leave a Replay

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