[DDD] et le type void

et le type void [DDD] - C - Programmation

Marsh Posté le 12-08-2007 à 12:53:55    

:hello:  
 
J'essaye de debugguer un programme en utilisant DDD. Seulement j'ai une liste de (void *) dont il ne veut pas m'afficher le contenu, normal c'est un void. Serait il possible de l'associer a un type sachant que ce type est une structure connu par le programme ?

Reply

Marsh Posté le 12-08-2007 à 12:53:55   

Reply

Marsh Posté le 12-08-2007 à 13:51:30    

ffomnislash a écrit :

:hello:  
 
J'essaye de debugguer un programme en utilisant DDD. Seulement j'ai une liste de (void *) dont il ne veut pas m'afficher le contenu, normal c'est un void. Serait il possible de l'associer a un type sachant que ce type est une structure connu par le programme ?


 
Ne pas confondre "void *" et "void".
Le type "void" est un type "neutre" (à la limite du non-existant) destiné à une fonction ne renvoyant rien.
Un nom de fonction devant toujours être précédé d'un type pour la syntaxe, il a été créé ce type "void" qui signifie "pas de type".
 
Le type "void *" est un type "universel" destiné à récupérer un pointeur dont on ne connait pas le type à l'avance. Pour ne pas que le compilo gueule quand on affecte un pointeur de type "X" dans un pointeur de type "Y", il a été créé ce type "void *" signifiant "pointeur universel donc j'ai le droit d'y mettre n'importe quel pointeur" (auparavant ce rôle était dévolu au "char *" mais le type "void *" permet de lever l'ambigüité de style "est-ce qu'il a écrit char * pour pointeur de caractère ou char * pour pointeur universel" )
 
Bien que les deux types utilisent le même mot clef "void", ils sont totalement différents.
 
Donc tu as récupéré un pointeur dans une variable de type "void *". Ben pas de problème pour aller chercher les éléments correspondants. Il te suffit juste de "caster" ce pointeur en type connu au-moment de son utilisation
 
Exemple

Code :
  1. struct s_exemple {
  2.     char carac;
  3.     int nb;
  4.     double dbl;
  5. };
  6. void *pt;
  7. pt=machin_truc_qui_me_renvoie_un_pointeur_sur_la_structure_ci_desus();


 
Soluce 1

Code :
  1. printf("Le caractère est '%c'\n", ((struct s_exemple*)pt)->carac);
  2. printf("Le nombre est '%d'\n", ((struct s_exemple*)pt)->nb);
  3. printf("Le double est '%f'\n", ((struct s_exemple*)pt)->dbl);


 
Soluce 2

Code :
  1. struct s_exemple *pt2;
  2. pt2=(struct s_exemple*)pt;
  3. printf("Le caractère est '%c'\n", pt2->carac);
  4. printf("Le nombre est '%d'\n", pt2->nb);
  5. printf("Le double est '%f'\n", pt2->dbl);


Message édité par Sve@r le 12-08-2007 à 13:53:09

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 12-08-2007 à 14:23:07    

merci pour l'explication de la distinction entre void et void *.
 
Ceci dit pour l'utilisation je n'ai pas de problème. Mon problème est avec le debuggeur ddd, il permet d'afficher le contenu d'une variable (dans le cas d'une structure, les différents champs). Le problème c'est que j'ai une variable de type void* et que j'aimerais préciser au débuggeur le type exacte.
 
Pour être plus précis. J'ai un pointeur qui est modifié je ne sais pas où et j'aimerai le savoir. Ce pointeur se trouve dans une structure.
J'ai une liste qui contient des éléments de cette structure. La liste utilise pour les données le type void*.
 
Ce que j'aimerai donc faire c'est afficher les champs de cette donnée afin de pouvoir surveiller l'état d'un des champs.

Reply

Marsh Posté le 12-08-2007 à 14:41:56    

ffomnislash a écrit :

Mon problème est avec le debuggeur ddd, il permet d'afficher le contenu d'une variable (dans le cas d'une structure, les différents champs). Le problème c'est que j'ai une variable de type void* et que j'aimerais préciser au débuggeur le type exacte.


Je connais pas ddd. Donc la seule solution est que ta variable ne soit pas de type "void *"
 

ffomnislash a écrit :

Pour être plus précis. J'ai un pointeur qui est modifié je ne sais pas où et j'aimerai le savoir. Ce pointeur se trouve dans une structure.
J'ai une liste qui contient des éléments de cette structure. La liste utilise pour les données le type void*.


Là on touche peut-être du doigt un problème plus profond. En théorie, tu ne devrais pas avoir de type "void *". Tu as une liste de "quelque-chose" dont ton type devrait-être "quelque-chose *".
Même mieux => ton pointeur ne devrait pas être modifié sans que tu le saches (à la limite cela fait peur car on se dit "si même lui ne sait pas où est modifiée sa variable qu'est-ce que ce doit-être..." ).
 
Sinon n'oublie-pas que le débugging a été inventé bien avant ddd. Il y a le bon-vieux "printf()" qui reste incontournable. Tu fais un "printf()" au début, un "printf()" à la fin et tu compiles et tu regardes. Puis tu déplaces celui du début et celui de la fin en les rapprochant. Tu tomberas fatalement sur la ligne (ou la fonction) où le truc est modifié. Si c'est une fonction tu te places au début et à la fin et tu recommences la même manip...


Message édité par Sve@r le 12-08-2007 à 14:43:25

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 12-08-2007 à 14:46:13    


La liste est "générique", ce n'est pas moi qui l'ai créé, je l'utilise seulement.
 
Sinon oui normalement je devrait savoir ou elle est modifiée, c'est ce qui m'inquiète  :D  

Reply

Marsh Posté le 12-08-2007 à 15:08:44    

Problème réglé, ce n'était pas directement lié à mon code, mais plutot à une mauvaise compréhension d'un évènement.

Reply

Marsh Posté le 12-08-2007 à 15:54:51    

ffomnislash a écrit :

Problème réglé, ce n'était pas directement lié à mon code, mais plutot à une mauvaise compréhension d'un évènement.


Ouf. Nous sommes sauvés (mais c'était pas loin cette fois-ci)... :sol:  


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

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