de char** à void**

de char** à void** - C - Programmation

Marsh Posté le 03-04-2004 à 21:44:21    

Bonsoir tout le monde
 
Ya un truc qui me turlupinait depuis quelque temps, cf. le code suivant :
 

Code :
  1. void* test(void** ptr) {
  2. return *ptr;
  3. }
  4. int main(void) {
  5. char* ptr;
  6. ptr = test(&ptr);
  7. return 0;
  8. }


 
GCC (MinGW) me sort ceci :
warning: passing arg 1 of `test' from incompatible pointer type
 
Alors comment faire pour éviter ce warning sans faire ceci ?
(c'est pas équivalent mais c'est juste pour donner un exemple)
 

Code :
  1. int main(void) {
  2. char* ptr;
  3. void* gen_ptr = ptr;
  4. ptr = test(&gen_ptr);
  5. return 0;
  6. }


 
merci !


Message édité par leneuf22 le 03-04-2004 à 21:46:15
Reply

Marsh Posté le 03-04-2004 à 21:44:21   

Reply

Marsh Posté le 03-04-2004 à 21:55:38    

comme déjà expliqué, seules les conversions T* <-> void* sont implicites. or ici, il faut faire 2 converstions successives, le compilateur ne le fait pas. donc à toi de rajouter le cast comme il faut. et tu le fait très bien (c'est bien de vouloir comprendre et pas de caster directement)
 
gen_ptr = ptr ; // char* -> void* 1ère conversion
&gen_ptr; // void** -> void** ok
 
 
sinon, (void**) &s vas y doucement, en connaissance de cause


Message édité par Taz le 03-04-2004 à 21:56:13
Reply

Marsh Posté le 03-04-2004 à 22:03:40    

Ok merci bien
 
par contre le cast direct en (void**) me sort un autre warning (peut-être dû à mes options de compilation)
warning: dereferencing type-punned pointer will break strict-aliasing rules
 
De toute façon si les compilos aiment pas, mieux vaut expliciter en effet

Reply

Marsh Posté le 03-04-2004 à 22:18:15    

-Wstrict-aliasing + -fstrict-aliasing provoque l'erreur, c'est normal. j'ai merdé, je suis pas capable de faire ce que je dis moi même
 
(void*) &s // 1ere converstion
 
l'autre conversion peut être faite implicitement
 
mais sinon, c'est
 
(void**)(void*) &s; :D


Message édité par Taz le 03-04-2004 à 22:19:56
Reply

Marsh Posté le 03-04-2004 à 22:34:20    

Oui exact (ça m'apprendra à avoir 3 tonnes d'arguments)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed