 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
nico Guest
|
Posted: Thu Jun 02, 2005 9:23 pm Post subject: static_cast... |
|
|
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
|
|
| Back to top |
|
 |
nico Guest
|
Posted: Thu Jun 02, 2005 9:57 pm Post subject: Re: static_cast... |
|
|
nico wrote:
| Quote: | 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
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Jun 02, 2005 11:00 pm Post subject: Re: static_cast... |
|
|
On Thu, 02 Jun 2005 23:23:14 +0200, nico <nospam (AT) spam (DOT) fr>:
| Quote: | //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; }
| Quote: | D'ailleurs au passage, faut-il faire un delete sir ret ?
|
La réponse est vraisemblablement dans la documentation de ton OS.
|
|
| Back to top |
|
 |
nico Guest
|
Posted: Fri Jun 03, 2005 9:14 am Post subject: Re: static_cast... |
|
|
Salut,
| Quote: | #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.
| Quote: | 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
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Fri Jun 03, 2005 5:10 pm Post subject: Re: static_cast... |
|
|
On Thu, 02 Jun 2005 23:57:44 +0200, nico <nospam (AT) spam (DOT) fr>:
| Quote: | 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().
|
|
| Back to top |
|
 |
Horst Kraemer Guest
|
Posted: Sat Jun 04, 2005 8:01 am Post subject: Re: static_cast... |
|
|
nico <nospam (AT) spam (DOT) fr> wrote:
| Quote: | 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!
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|