OVH Cloud OVH Cloud

static_cast...

5 réponses
Avatar
nico
Bonjour,

Voila dans un prog je recupère une structure hostent qui contient donc entre
autre une liste d'adresses ip, pour afficher les adresses je dois récupérer
les différentes parties de l'ip en tant que nombre et non char (pour pas
que ca soit pris en tant que caractère pour pouvoir créer ma QString).

Donc je fais qqch comme ca :

//ds mon header
//...
#define C_ADDR(x) static_cast<int>(static_cast<unsigned char>(x))
//...

//dans mon cpp :
//...

char host[128];
size_t len = 128;

if( gethostname(host, len) == 0)
{
hostent * ret = gethostbyname(host);

if (ret != NULL )
{
_localContact.login = QString(ret->h_name);
_localContact.ip.setAddress( QString("%1.%2.%3.%4")
.arg( C_ADDR(ret->h_addr_list[1][0]) )
.arg( C_ADDR(ret->h_addr_list[1][1]) )
.arg( C_ADDR(ret->h_addr_list[1][2]) )
.arg( C_ADDR(ret->h_addr_list[1][3])) );

qDebug( _localContact.login );
qDebug( _localContact.ip.toString() );
}
}

//...


Ca fonctionne très bien mais j'aimerai savoir s'il y a moyen de simplifier
les static_cast<int>(static_cast<unsigned char>(x))...

Merci.

--
nico

5 réponses

Avatar
nico
nico wrote:


char host[128];
size_t len = 128;

if( gethostname(host, len) == 0)
{
hostent * ret = gethostbyname(host);



D'ailleurs au passage, faut-il faire un delete sir ret ?

--
nico

Avatar
Fabien LE LEZ
On Thu, 02 Jun 2005 23:23:14 +0200, nico :

//ds mon header
//...
#define C_ADDR(x) static_cast<int>(static_cast<unsigned char>(x))


C'est très très très dangereux, un tel #define dans un header.
Mieux vaut un

inline int C_ADDR (unsigned char c) { return c; }


D'ailleurs au passage, faut-il faire un delete sir ret ?


La réponse est vraisemblablement dans la documentation de ton OS.

Avatar
nico
Salut,

#define C_ADDR(x) static_cast<int>(static_cast<unsigned char>(x))


C'est très très très dangereux, un tel #define dans un header.
Mieux vaut un

inline int C_ADDR (unsigned char c) { return c; }


ok j'ai modifié, ca marche merci.

D'ailleurs au passage, faut-il faire un delete sur ret ?


La réponse est vraisemblablement dans la documentation de ton OS.


Faut croire que non alors.

--
nico


Avatar
Fabien LE LEZ
On Thu, 02 Jun 2005 23:57:44 +0200, nico :

D'ailleurs au passage, faut-il faire un delete sir ret ?


En fait, un delete, certainement pas : il s'agit très
vraisemblablement d'une API faite pour les programmeurs C, qui n'ont
pas accès à delete.

Un free(), c'est possible, mais improbable.

Une possibilité assez courante : la fonction renvoie un pointeur vers
un objet statique. Cf localtime().

Avatar
Horst Kraemer
nico wrote:

nico wrote:


char host[128];
size_t len = 128;

if( gethostname(host, len) == 0)
{
hostent * ret = gethostbyname(host);



D'ailleurs au passage, faut-il faire un delete sir ret ?


Jamais.

D'ailleurs apres

ret1 = gethostbyname();
...
ret2 = gethostbyname():

le contenu de la structure pointée par ret1 peut devenir invalide par
le deuxième appel. Donc il faut copier les valeurs qu`on veut garder
avant le deuxième appel (Il ne suffit pas de copier les pointeurs dans
la structure. Il faut toujours copier les valeurs auquelles les
pointeurs pointent - "deep copy").

--
Horst

--
Lâche pas la patate!