Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2758 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2230670
nicoalas78
Posté le 12-06-2014 à 20:21:01  profilanswer
 

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.
mood
Publicité
Posté le 12-06-2014 à 20:21:01  profilanswer
 

n°2230671
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 12-06-2014 à 20:59:58  profilanswer
 

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
n°2230672
nicoalas78
Posté le 12-06-2014 à 21:56:02  profilanswer
 

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

n°2230673
kferfred
Posté le 12-06-2014 à 22:04:31  profilanswer
 

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

n°2230674
nicoalas78
Posté le 12-06-2014 à 22:10:50  profilanswer
 

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 ?

n°2230696
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 13-06-2014 à 10:45:46  profilanswer
 

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
n°2230697
nicoalas78
Posté le 13-06-2014 à 10:48:39  profilanswer
 

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.
n°2230712
nicoalas78
Posté le 13-06-2014 à 11:26:13  profilanswer
 

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

n°2230731
theshockwa​ve
I work at a firm named Koslow
Posté le 13-06-2014 à 12:18:36  profilanswer
 

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
n°2230748
nicoalas78
Posté le 13-06-2014 à 13:42:44  profilanswer
 

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.
mood
Publicité
Posté le 13-06-2014 à 13:42:44  profilanswer
 

n°2230810
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 13-06-2014 à 19:22:26  profilanswer
 

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
n°2230818
nicoalas78
Posté le 13-06-2014 à 22:04:17  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
C/C et fermer un fichier[C++ / Qt / Android] Mode debug qui ne fonctionne pas ?
[C] Détails allocation mémoireApplication pour les développeurs (présenté comme ça)
[Résolu]Installer environnement de développement manuel ou non ?Interface graphique application JAVA
Soiréee User Group C++ Francophone - En faire ++ avec C++Programme C qui affiche les caractères saisis par l'utilisateur
Format des nombres en CURGENT s.v.p Aider moi !!!
Plus de sujets relatifs à : URGENT ! Fin de développement d'application C++ avec MFC


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR