begin process at 2012 05 30 08:01:25
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Divers

 > 

Types de variable avec C++Builder 6.0


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Types de variable avec C++Builder 6.0

jeudi 13 janvier 2005 à 02:23:15 | Types de variable avec C++Builder 6.0

CrAsH0v3r

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.

jeudi 13 janvier 2005 à 08:33:04 | Re : Types de variable avec C++Builder 6.0

otofraise

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
jeudi 13 janvier 2005 à 10:10:27 | Re : Types de variable avec C++Builder 6.0

BruNews

Administrateur CodeS-SourceS
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++
jeudi 13 janvier 2005 à 15:10:41 | Re : Types de variable avec C++Builder 6.0

CrAsH0v3r

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

@+!
jeudi 13 janvier 2005 à 15:16:17 | Re : Types de variable avec C++Builder 6.0

otofraise

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


Cette discussion est classée dans : types, sin, strmessage, phe, chrmess


Répondre à ce message

Sujets en rapport avec ce message

récuparation IP [ par cyril4900 ] Bonjour, Voila je veux un code qui me récupère l'addresse IP de ma machine hote qui fonctionne sur Winows et LINUX. Et c'est la le problème car j'ai CantFindResourceEx binaire [ par Galmiza ] Je souhaite mettre des données binaires dans une resource mais:     HRSRC hRes = FindResourceEx(NULL,                         & socket envoie de text d'apres un fichier [ par hijakhakker ] salutj'utilise recement les socket et je teste une source qui utilise les socket pour envoyer hello world a qui se connect :#include #pragma comment(l [C++]problemes generes par une classe-errerus incomprehensibles [ par lolobardon ] Bonjour,je suis eleve ingenieur en electronique et j'effectue mon dernier semestre a Pekin en bossant sur un projet en C++ d'ou beaucoup de difficulte Pb de pointeur [ par cz1702 ] Bonjour à tous, j'ai fait une classe pour l'utilisation des sockets qui fonctionne bien pour une utilisation, mais quand que je fait appelle plusieurs [socket et api win]recevoir et envoyer en meme temps [ par shadow1779 ] Bonjour je me suis fais un petit programme irc qui me servira de bot pour auto-op des personne ou d'autre taches diverses, le client aura une boite de Socket C et api [ par shadow1779 ] Bonjour,j'ai un petit prob avec un bot que j'essai de faire avec l'api et les sockets en C, pour l'instant on ne peux que cliquer sur le bouton connec classe liste [ par programe_smi ] on m'a demandé de réaliser une classe "liste" de listes chaînées comportant des objets de types différents pour cela on m'a dmandé de creer une classe Aide sockets non bloquants [ par shadow1779 ] il n'y a pas longtemps on m'a filé un ebook sur les sockets C avec l'API j'ai compris deux trois truc mais j'ai l'impression de caler j'aimerai qu'on Les types [ par emmanuel9 ] Bonjour à tous, J'ai un objet TextBox par exemple et je voudrais savoir si il hérite de la classe Object ? (c'est un cas d'école), comment faire cela


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,406 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales