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

  FORUM HardWare.fr
  Programmation
  C++

  [ C++ ] Passer par adresse un vecteur à 2 dimensions + malloc

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[ C++ ] Passer par adresse un vecteur à 2 dimensions + malloc

n°1080972
jeoff
Posté le 12-05-2005 à 15:39:22  profilanswer
 

Bonjour :)
 
Ahhh ! Ces fameux pointeurs, je ne sais pas si un jour j'y arriverai.
J'en arrive à aimer VB avec ses "ByRef MSG(,) As String" ...
 
Pour résumer la situation, je dois adapter un boût de code initialement écrit en VB vers du code C++.
J'utilise pour celà eVC++ (le C++ pour Pocket PC dirons nous).
 
J'en arrive à mon problème.
 
Une connection est établie entre le pocket PC et un serveur.
Le Pocket PC envoie des requêtes SQL au serveur et le serveur renvoie une chaîne de caractères.
 
Cette chaîne de caractère contient les résultats de mon recordset concatenés et séparé par "~~" (double tilde, caractère 126) entre chaque enregistrements et "^" entre chaque champs.
Jusque là tout va bien, je récupère ma chaîne concatenée sur le PocketPc qui contient le résultat de ma requête.
 
Il me reste donc à découper cette chaîne via ma fonction "decoupage".
Ne sachant pas trop comment m'y prendre, j'ai choisi d'utiliser des tableaux de chaînes de caractères à deux dimensions (du C donc).
La première contenant les lignes et la seconde contenant les colonnes.
 
C'est là que ca se corse.
 
Dans ma chaîne concatenée, il y a un entête.
 
ex : "25~~3~~"
 
Cet entête signifie que j'ai 25 enregistrements de 3 colonnes.
J'extrait donc ces caractères, je fait la conversion en numérique et j'obtiens mes deux variables ligne et colonne.
Et à partir de ces deux valeurs, je veux dimensionner un tableau passé par adresse à ma fonction "découpage".
 
Par la suite je vais donc parcourir ma chaîne concatenée à la recherche de mes résultats et les stocker dans mon tableau à deux dimensions.
Pour ce faire, dans un premier temps je ne m'occupe que de la séparation des lignes.
 
 
Voici le code correspondant, il refuse de compiler sur "strcat".
'strcat' : cannot convert parameter 1 from 'char ** ' to 'char *'
 
Mais je suis tellement mauvais que le code est peut être entièrement à revoir ...
 

Code :
  1. bool connexion::decoupage(char * bytes,int SIZE)
  2. {
  3. int ligne;
  4. int colonne;
  5. int i=0;
  6. int j=0;
  7. int k=0;
  8. char buffer[2];
  9. char * cMSG;
  10. vector<vector<CString> > MSG; //vecteur à deux dimensions.
  11. colonne=extract_size(bytes,&i); //à ce moment i=0
  12. ligne=extract_size(bytes,&i);
  13. //allocation dynamique du recordset MSG
  14. MSG.resize(ligne);
  15. for (k=0;k<ligne;k++)
  16. {
  17.  MSG[k].resize(colonne);
  18. }
  19.     //--- extrait le champs 0 à n (stocke chaque champ dans une chaine différente msg_receive())
  20.     while (ligne > j) //eventuellement rajouter i<50000
  21. {
  22.  MSG[j][0] = '\0';
  23.                 //compte la taille à allouer à cMSG
  24.  for (k=i;(bytes[k]!=126 || bytes[k+1]!=126);k++)
  25.  {}
  26.  cMSG= (char*)malloc(k-i+1);//MSG[j][0].GetLength()+1);
  27.         while ((bytes[i] != 126) || (bytes[i + 1] != 126))
  28.  {
  29.   if (bytes[i] == 0)
  30.   {
  31.    if ((recv(ServerSock, bytes, SIZE,0))==SOCKET_ERROR)
  32.    {
  33.     wsprintf (szError, TEXT("No data is received, recv failed." )
  34.      TEXT(" Error: %d" ), WSAGetLastError ());
  35.     MessageBox (NULL, szError, TEXT("Client" ), MB_OK);
  36.     return false;
  37.    }
  38.                 i = 0;
  39.   }
  40.             else
  41.   {
  42.    buffer[0]=bytes[i]; //bidouille pour strcat ...
  43.    buffer[1]='\0';
  44.    strcat(cMSG,buffer);
  45.    i = i + 1;
  46.             }
  47.         }
  48.  MSG[j][0]=cMSG;
  49.         i = i + 2;
  50.         j = j + 1;
  51.  MessageBox(NULL,MSG[j][0],TEXT("test" ),MB_OK);
  52.     }
  53.     //decoupage_colonne(msg_receive, nbre_colonne, ret_console)
  54.        
  55.         delete cMSG;
  56. return true;
  57. }


 
 
P.S. Si il existe une solution moins lourde pour gérer les chaînes et qui permette la réallocation dynamique, je suis preneur.


Message édité par jeoff le 16-05-2005 à 13:27:46
mood
Publicité
Posté le 12-05-2005 à 15:39:22  profilanswer
 

n°1081041
skelter
Posté le 12-05-2005 à 16:12:16  profilanswer
 

puisque tu fais du C++, uses et abuses de la SL, commence par construire un std::istringstream a partie du contenu du buffer
travail avec std::string, std::vector...
 
la doc de std::istringstream se trouve sur cplusplus.com (reference->iostream library)

n°1081054
jeoff
Posté le 12-05-2005 à 16:18:54  profilanswer
 

ok merci, je vais jeter un oeil, sinon j'avais commencé à regarder les CString et virer tous les char * .
 
Ca commence à me donner mal au crâne toutes ces étoiles :lol:


Message édité par jeoff le 12-05-2005 à 16:19:23
n°1081071
skelter
Posté le 12-05-2005 à 16:27:53  profilanswer
 

utilises de preferences std::string et tout ce qui est standard (iostream, STL), tu verras c'est beaucoup plus simple

n°1082328
jeoff
Posté le 13-05-2005 à 14:59:22  profilanswer
 

J'ai modifié un peu mon code.
 
Pour l'instant je teste à l'intérieur de la fonction, j'ai donc viré le paramètre "char *** MSG".
 
Je teste les vecteurs. J'ai eu un peu de mal à trouver de la doc sur des vecteurs à deux dimensions et j'aimerai bien savoir ce qu'il contiennent (le débuggeur ne me montre que la première case de ma première colonne :'( ).
 
Vous aurez aussi remarqué qu'il traîne encore deux char * dont je n'arrive pas à me débarasser "*cMSG" et "buffer".
 
En fait mon soucis c'est de concaténer MSG[0][j] avec bytes[i] sachant que bytes[i] est un seul caractère (pas de char de fin de châine donc ... d'où la bidouille vers buffer qui est une chaine de deux charactère (bytes[i] et fin de chaine) et de passer par cMSG comme intérmédiaire.
 
J'aimerai supprimer celà mais je n'ai pas trouvé comment :/.
 
Et dernière chose, je n'arrive aps à afficher mes MessagesBox (ca me sort une erreur à l'éxecution donc ca doit pas prendre les bons paramètres).
 
MessageBox(NULL,MSG[j][0],TEXT("test" ),MB_OK);
 
Il faut que je passe un LPCTSTR mais j'ai essayé(LPCTSTR)MSG[j][0],LPCTSTR(MSG[j][0]) ca marche pas mieux ... (dans le dernier cas ca freeze l'émulateur PocketPC ... sinon ca crash)
 
En gros je butte sur des détails :sweat:
 
P.S. Ca vire un peu au C++ ce topic  :whistle:


Message édité par jeoff le 13-05-2005 à 15:41:33
n°1082339
jejech
Love is all
Posté le 13-05-2005 à 15:04:43  profilanswer
 

Surtout qd tu dors 2h15... :sleep:

n°1085347
jeoff
Posté le 16-05-2005 à 13:26:34  profilanswer
 

:bounce:
 
Je cherche également un moyen de désalouer "MSG".
 
Pour un vecteur j'ai trouvé mais là c'est un vecteur de vecteurs et je sèche :sweat:
 
Merci :)


Message édité par jeoff le 16-05-2005 à 13:28:46
n°1085383
skelter
Posté le 16-05-2005 à 14:17:42  profilanswer
 

tu perds ton temps la
 

skelter a écrit :

puisque tu fais du C++, uses et abuses de la SL

n°1085515
jeoff
Posté le 16-05-2005 à 15:38:32  profilanswer
 

j'aimerai bien utiliser <iostream> et ton "istringstream" de la "SL" mais c'est du dev pocket PC et cette librairie ne figure pas dans le SDK PPC2003 ... Je peux éventuellement l'inclure à la main mais je ne garanti pas que ca fonctionne ...
 
et je vois pas trop en quoi je perds mon temps avec les vecteurs puisque ca semble correspondre à ce que je cherche pour ranger mes données et que tu m'en as parlé toi même :heink:
 
Je vais commencer par passer les CString en string histoire de faire un truc plus "standard" :D.


Message édité par jeoff le 16-05-2005 à 15:39:17
n°1085540
skelter
Posté le 16-05-2005 à 15:45:31  profilanswer
 

vector<vector<string> > MSG; c'est ok, nul besoin de désalouer explicitement quoi que ce soit

mood
Publicité
Posté le 16-05-2005 à 15:45:31  profilanswer
 

n°1085689
jeoff
Posté le 16-05-2005 à 16:34:53  profilanswer
 

ok pour les vecteurs merci :)
 
par contre j'ai essayé de passer les CString en string mais ca m'arrange pas trop en fait car après je passe mon temps à fare des conversions entre les objets pour l'affichage qui prennent des CString et les traitements en std::string ...
 
D'après ce que j'ai "compris" c'est un type propre aux MFC ces CString ?
 


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

  [ C++ ] Passer par adresse un vecteur à 2 dimensions + malloc

 

Sujets relatifs
problème avec malloc enfin je pense ...vecteur de vecteur
comment récupérer l'adresse d'une page ?correspondance tableau deux dimensions - gridlayout [résolu]
passage de variable par adresse, Comment passer deux fonctions ?[VC++] Affecter 1 adresse connue au pointeur d'1 structure
Passer de VS.Net 2003 à VS.Net 2005 peut-il se faire gratuitement?[Java]Comment passer par référence un int ?
dimensions & popup 
Plus de sujets relatifs à : [ C++ ] Passer par adresse un vecteur à 2 dimensions + malloc


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