Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2475 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [DDD] et le type void

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[DDD] et le type void

n°1598685
ffomnislas​h
Posté le 12-08-2007 à 12:53:55  profilanswer
 

: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 ?

mood
Publicité
Posté le 12-08-2007 à 12:53:55  profilanswer
 

n°1598690
Sve@r
Posté le 12-08-2007 à 13:51:30  profilanswer
 

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.
n°1598693
ffomnislas​h
Posté le 12-08-2007 à 14:23:07  profilanswer
 

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.

n°1598695
Sve@r
Posté le 12-08-2007 à 14:41:56  profilanswer
 

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.
n°1598697
ffomnislas​h
Posté le 12-08-2007 à 14:46:13  profilanswer
 


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  

n°1598706
ffomnislas​h
Posté le 12-08-2007 à 15:08:44  profilanswer
 

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

n°1598714
Sve@r
Posté le 12-08-2007 à 15:54:51  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [DDD] et le type void

 

Sujets relatifs
Incompatibilité de type avec une boucle ForEcrire type=1 dans un fichier
Problème de type sur Variable de formulaireagument par default ( c'ets normal??) EDIT
Ouverture fichier type pdfComment créer un formulaire type web en C/C++
Typage d'un pointeur "void *"Un CMS du type Plone en php/mysql
[VBA E]problem avec un type de variablereaddir, comment trier par type?
Plus de sujets relatifs à : [DDD] et le type void


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR