Types de variable avec C++Builder 6.0

CrAsH0v3r Messages postés 13 Date d'inscription dimanche 13 octobre 2002 Statut Membre Dernière intervention 7 mars 2005 - 13 janv. 2005 à 02:23
otofraise Messages postés 66 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 4 novembre 2010 - 13 janv. 2005 à 15:16
Bonjour,

voilà, je travaille sur une petite application client-serveur. La connection fonctionne à merveille, mais j'ai des problèmes dus au types de mes variables, voici le code problématique :

char * strMessage;
char *strIp;
..
..
..
void __fastcall TfrmServer::ObtenirIP() //Afin d'obtenir le ip du serveur.
{
struct sockaddr_in sin;
struct hostent * phe;
char FAR buffer[64] ;


// Initialisation du service WSA
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);



// Récupération du nom de la machine
gethostname(buffer, sizeof(buffer));


// Récupération de la liste d'ips associées à la machine
phe = gethostbyname(buffer);
if(phe==NULL)
{
//cerr << "Erreur : pointeur nul";
WSACleanup();
system("PAUSE");
exit(1);
}


// Enumération des adresses
int I = 0 ;
while((phe->h_addr_list[I+1])!=NULL)
{
I++;
}
memcpy(&sin.sin_addr.s_addr, phe->h_addr_list[I], phe->h_length);
strIp = inet_ntoa(sin.sin_addr);
txtIP->Text=strIp;


WSACleanup();
}

Ensuite, dans une autre fonction, je veux envoyer un message au client :

....Fonction(..)
{
char *chrMess;
..
..
..
strMessage = "Vous êtes connectés à " ; //(1)
strcat(strMessage, strIp); //(2)
chrMess = "sur le port 300"; //(3)
strcat(strMessage, chrMess); //(4)
send(klist->sock,strMessage,SinDist.sin_port,0); //(5)
..
..
..
}

Bon, je vais faire la trace de cette partie de programme pour démontrer ce qui ce produit

(1) strMessage prend le texte. strMessage = Vous êtes connectés à
(2) La concaténation se fait, strMessage devient donc "Vous êtes connectés à ab.cde.fg.hij"
(3) chrMess ne prend pas la bonne valeur, il devient "b.cde.fg.hij"
(4) La concaténation fonctionne, strMessage devient donc "Vous êtes connectés à ab.cde.fg.hijb.cde.fg.hij" --- Le IP se répète mais en perdant le premier caractère!
(5) Le message reçu par le client est celui du #4.

Je crois comprendre que le problème vient du fait que lors de la première concaténation, les pointeurs sont mal géré et ce qui est stocké en mémoire est désordonné, ce pourquoi chrMess ne contient pas le texte que je lui ai donné..

Si quelqu'un avait une idée comment je pourrais concaténer les 3 chaines soit. StrMessage + strIP + chrMess comme il faut, je serais intéressé.

De plus, comme vous avez probablement constaté, le choix des types de variables est possiblement mal fait, vous pouvez me le dire, je suis ouvert aux commentaires. Aussi, si vous avez des sources qui pourrait m'aider à bien comprendre l'utilisation des différents types, j'apprécierais.

Concernant l'obtention du IP, celà provient d'une source prise sur ce site, et qui fonctionne. Ma question principale est donc pour ma concaténation. Le message envoyé devrait être
"Vous êtes connectés à ab.cde.fg.hij sur le port 300"

Merci de votre aide et de vos suggestions.

4 réponses

otofraise Messages postés 66 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 4 novembre 2010
13 janv. 2005 à 08:33
Salut,

Pour la concatenation de chaine sous builder tu as deux solutions :

Soit passer par les fonctions de string.h, soit utiliser la classe de borland AnsiString

Avec string.h :

char* Chaine1, *Chaine2;

strcpy(Chaine1, "Bonjour");
strcpy(Chaine2, " Vous");
strcat(Chaine1, Chaine2);

//A ce moment Chaine1 == "Bonjour Vous"

Pour placer du texte dans un char*, tu dois utiliser strcpy, ca evite les pb memoire.L'operateur ne peut etre utiliser qu'a l'initialisation de la variable (char* Chaine "Bonjour";)
Avec AnsiString :

AnsiString Chaine;

Chaine = "Bonjour";
Chaine += " Vous";

//Et voila Chaine == "Bonjour Vous"

Ensuite pour recuperer un char* : Chaine.c_str();

Si tu as d'autres questions, n'hesite pas

Oto
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 janv. 2005 à 10:10
strMessage = "Vous êtes connectés à " ;
strMessage pointant sur une constante, on n'y concatenera rien du tout.

char strMessage[256];
strcpy(strMessage, "Vous êtes connectés à ");
strcat(strMessage, "trucMuche");

la sera ok.

ciao...
BruNews, MVP VC++
CrAsH0v3r Messages postés 13 Date d'inscription dimanche 13 octobre 2002 Statut Membre Dernière intervention 7 mars 2005
13 janv. 2005 à 15:10
Merci à tous les 2, mon problème est réglé.

Avec la solution d'oko, j'obtenais un erreur de violation, j'ai donc changé mes pointeurs pour des chaines fixes, comme Brunews a dit et ça fonctionne.

Et merci à Oko pour tes explications, je saurai faire la différences. Et grace à toi, je sais maintenant comment obtenir un char* d'un ansistring, ce qui me causais aussi problème

@+!
otofraise Messages postés 66 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 4 novembre 2010
13 janv. 2005 à 15:16
A ben oui que je suis bete, mes char* pointait sur rien

C'est sur que ca marche mieux avec des

char Variable[NbCarac] ;

dsl pour l'erreur et merci a BruNews pour la correction

Oto
Rejoignez-nous