comment représenter int * comme tableau dans totalview?

Comment puis-je ‘plonger’ dans un int * qui pointe vers un tableau d’entiers alloué dynamicment et le représente comme un tableau int [] fixe? Autrement dit, si je plonge dans un int *, il affiche l’adresse et le int pointé, mais je voudrais plutôt voir le tableau de tous les entiers.

J’ai remarqué la balise TotalView sur cette question. Demandez-vous comment voir les valeurs de votre tableau dans totalview? Si oui, la réponse est assez facile.

Disons que vous avez un pointeur p de type int * et qu’il pointe actuellement vers un tableau de 10 entiers.

Étape 1. Plongez sur le pointeur. Pour ce faire, double-cliquez, cliquez sur le bouton central de la souris ou utilisez l’option de plongée du menu contextuel, le tout après avoir placé le curseur de la souris sur la variable dans le volet du code source ou du volet de la stack.

Cela fera apparaître une nouvelle fenêtre qui dira

Expression: p Adresse: 0xbfaa1234 Type: int *

et dans la zone de données dira quelque chose comme

0x08059199 -> 0x000001a5 (412)

Cette fenêtre vous montre le pointeur lui-même, l’adresse indiquée est l’adresse du pointeur. La valeur (0x08059199 dans l’exemple ci-dessus) est la valeur réelle du pointeur. Tout ce qui se trouve à droite de la flèche n’est qu’un “indice” indiquant que vous voulez que le message soit dirigé.

Étape 2. Plongez à nouveau sur le pointeur. Répétez le double clic ou le bouton central de la souris, cette fois sur la valeur de données dans la fenêtre de variable. (Vous double-cliquez donc là où il est indiqué 0x08059199).

Cela va effectivement “déréférencer” le pointeur. La fenêtre est maintenant centrée non pas sur le pointeur lui-même, mais sur la chose sur laquelle il pointe. Notez que la zone d’adresse contient maintenant 0x08059199 qui était la valeur avant.

expression: * (((int *) p)) Adresse: 0x08059199 Type: int

et dans la zone de données, il dira quelque chose comme

0x000001a5 (412)

Étape 3. Définissez la fenêtre de données sur le type souhaité. Il suffit de cliquer dans le champ de type et de le changer pour dire int [10]. Puis appuyez sur retour.

Cela indique au débogueur que 0x08059199 est le début d’un tableau de 10 entiers.

La fenêtre développera deux nouveaux champs: Slice et Filter. Vous pouvez les laisser pour l’instant, mais ils pourront vous être utiles plus tard.

La zone de données va maintenant afficher deux colonnes “champ” et “valeur” et 10 lignes.

La colonne de champ sera l’index dans le tableau [0] – [9] et la colonne de valeur vous indiquera les données que vous avez dans chaque emplacement de tableau.

Autres astuces:

  • Dans les structures de données plus complexes, vous pouvez souhaiter plonger sur des éléments individuels (qui peuvent également être des pointeurs, la plongée les déréférencera également)

  • Vous pouvez toujours transtyper différents types ou longueurs pour examiner les données “comme si elles étaient”

  • Vous pouvez éditer les valeurs de données réelles en cliquant sur la colonne de valeurs et en modifiant ce que vous y trouvez. Ceci est utile lorsque vous voulez provoquer un comportement spécifique de votre application.

  • Vous pouvez toujours annuler les opérations de plongée avec l’icône “<" située dans le coin supérieur droit de la fenêtre de la variable.

Certaines vidéos en ligne pourraient vous être utiles à l’adresse

http://www.roguewave.com/products/totalview/resources/videos.aspx

il y en a notamment un intitulé “Premiers pas avec TotalView”.

N’hésitez pas à nous contacter chez Rogue Wave Software pour des conseils d’utilisation de TotalView! le support de roguewave dot com est une bonne adresse pour cela.

Chris Gottbrath (Chris Dot Gottbrath chez Roguewave Point Com) Chef de produit TotalView chez Rogue Wave Software

Ce n’est pas très difficile, mais j’ai oublié comment cela fonctionne exactement. Je t’ai trouvé une page qui explique ça;). Je pense que pour pointer et mettre en réseau avec ints appelé par exemple test, vous devriez le faire en utilisant & test. Il suffit de consulter cette page:

http://www.cplusplus.com/doc/tutorial/pointers/

Vous ne pouvez pas faire cela de manière significative sans savoir exactement combien d’ints se trouvent dans le tableau.

Si vous avez un int *p qui pointe vers le premier élément d’une donnée int contiguë, allouée dynamicment ou d’un tableau statique, vous pouvez l’indexer comme s’il s’agissait d’un tableau:

 int *data = malloc(3 * sizeof *data); int *p; /* malloc error detection omitted for brevity */ data[0] = 1; data[1] = 2; data[3] = 42; p = data; assert(p[0] == 1); assert(p[1] == 2); assert(p[2] == 42); 

Vous devez connaître la taille des données valides auxquelles vous accédez de cette manière.

Donc, disons que j’ai les data ci-dessus et que je veux écrire une fonction pour les imprimer. Il ne convient pas de déclarer la fonction comme ceci:

 void print_array(int *data); 

parce que quand vous appelez print_array(data); , la fonction ne connaît pas le nombre d’éléments à imprimer.

Vous pouvez définir votre print_array() comme:

 void print_array(int *data, size_t n); 

n représente le nombre d’éléments valides indiqués par les data , que l’appelant doit fournir. Vous pouvez également décider que chaque “tableau” se termine par une valeur sentinelle, une valeur utilisée uniquement à la fin des données et qui n’est pas une valeur utile sinon:

 data[2] = 0; /* data[0] and data[1] are useful, valid values and data[2] is 0 to signify the end of the data */ 

Ensuite, vous pouvez déclarer votre print_array() comme:

 void print_array(int *data); 

et continuez à indexer les data dans la définition de la fonction jusqu’à ce que vous atteigniez une sentinelle:

 void print_array(int *data) { size_t i; for (i=0; data[i] != 0; ++i) printf("%d\n", data[i]); } 

Donc, pour répondre à votre question, vous pouvez déjà traiter un pointeur sur une donnée valide allouée dynamicment comme un tableau. Vous devez bien sûr vous souvenir de la taille des données allouées, ce que vous devez également faire dans un tableau standard.