jeoff | 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 :
- bool connexion::decoupage(char * bytes,int SIZE)
- {
- int ligne;
- int colonne;
- int i=0;
- int j=0;
- int k=0;
- char buffer[2];
- char * cMSG;
- vector<vector<CString> > MSG; //vecteur à deux dimensions.
- colonne=extract_size(bytes,&i); //à ce moment i=0
- ligne=extract_size(bytes,&i);
- //allocation dynamique du recordset MSG
- MSG.resize(ligne);
- for (k=0;k<ligne;k++)
- {
- MSG[k].resize(colonne);
- }
- //--- extrait le champs 0 à n (stocke chaque champ dans une chaine différente msg_receive())
- while (ligne > j) //eventuellement rajouter i<50000
- {
- MSG[j][0] = '\0';
- //compte la taille à allouer à cMSG
- for (k=i;(bytes[k]!=126 || bytes[k+1]!=126);k++)
- {}
- cMSG= (char*)malloc(k-i+1);//MSG[j][0].GetLength()+1);
- while ((bytes[i] != 126) || (bytes[i + 1] != 126))
- {
- if (bytes[i] == 0)
- {
- if ((recv(ServerSock, bytes, SIZE,0))==SOCKET_ERROR)
- {
- wsprintf (szError, TEXT("No data is received, recv failed." )
- TEXT(" Error: %d" ), WSAGetLastError ());
- MessageBox (NULL, szError, TEXT("Client" ), MB_OK);
- return false;
- }
- i = 0;
- }
- else
- {
- buffer[0]=bytes[i]; //bidouille pour strcat ...
- buffer[1]='\0';
- strcat(cMSG,buffer);
- i = i + 1;
- }
- }
- MSG[j][0]=cMSG;
- i = i + 2;
- j = j + 1;
- MessageBox(NULL,MSG[j][0],TEXT("test" ),MB_OK);
- }
- //decoupage_colonne(msg_receive, nbre_colonne, ret_console)
-
- delete cMSG;
- return true;
- }
|
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
|