soustraire deux pointeurs [C] - C - Programmation
Marsh Posté le 17-01-2011 à 22:53:52
un cast ?
Marsh Posté le 17-01-2011 à 23:00:35
merci de ta réponse, qu'a le mérite d'économiser les disques durs du serveur !
Tu voudrais bien développer un peu ce que tu veux dire par là (un exemple de code ou bien un lien) steup ?
Marsh Posté le 17-01-2011 à 23:16:08
rank=((int)pint - (int)my_int_array) / sizeof( int);
Marsh Posté le 17-01-2011 à 23:22:16
Merci de ton aide !
En fait ce truc retourne une erreur de taille d'entier donc il faut remplacer les (int) par des (long)
Marsh Posté le 18-01-2011 à 11:01:15
Donne du code complet parce qu'il ne devrait pas etre necessaire d'utiliser des cast pour ca.
Marsh Posté le 18-01-2011 à 11:16:23
La division par sizeof(int) me parait curieuse (voire en trop).
Il devrait même être possible, grace à l'arithmétique des pointeurs, de faire directement :
rank = pint - my_int_array;
Après tout, pour accéder à l'élément de rang i dans le tableau , on fait juste :
pint = my_int_array + i;
de même que l'instruction pint++ fait avancer le pointeur sur l'élément suivant, quelle que soit sa taille.
Marsh Posté le 18-01-2011 à 13:48:23
Merci de votre aide.
Vous avez raison, l'arithmétique des pointeurs fonctionne comme on s'y attend :
on a un opérateur - (moins) qui à un couple de pointeurs du même type associe un entier correspondant à la différence des adresses divisée par la taille du type en question.
On donc a en fait toujours
Code :
|
J'avais mal interprété un message d'erreur qui venait du fait que mon pointeur n'avait pas été initialisé, ou je ne sais plus trop quoi.
Marsh Posté le 18-01-2011 à 17:28:57
Oui: L'arithmétique des pointeurs, c'est exactement fait pour cela:
Citation : p2 - p1 = (adresse contenue dans p2 - adresse contenue dans p1) /taille(éléments pointés par p1 et p2) |
( http://cpp.developpez.com/cours/cpp/?page=page_6#LVI-H )
A+,
Marsh Posté le 18-01-2011 à 18:24:51
Merci pour le lien et le tuyau sur ptrdiff_t. Je conçois que les soustractions de pointeurs soient effectivement une source potentielle d'erreur sérieuse. Le type ptrdiff_t n'est pas renseigné dans K&R à la page de stdlib.h, à moins que je ne me fourvoie. C'est parce qu'il est apparu dans une version postérieure de stdlib ou bien K&R n'est pas exhaustif ?
J'en profite pour ajouter à tout hasard que l'on peut aussi comparer deux adresses :
Code :
|
On ne peut en revanche pas multiplier un pointeur par quoi que ce soit, mais toutes les opérations définies sur le type int s'étendent naturellement à ptrdiff_t. Il faut par contre faire attention au fait que si je soustrais deux pointeurs du même type et que j'incrémente un pointeur d'un autre type de cette différence, il n'y a pas de conversions de taille. J'espère que ce morceau de code éclaire ce que je veux dire :
Code :
|
Merci à nouveau !
Ced'
Marsh Posté le 18-01-2011 à 19:40:07
unecrepe a écrit : Merci pour le lien et le tuyau sur ptrdiff_t. Je conçois que les soustractions de pointeurs soient effectivement une source potentielle d'erreur sérieuse. Le type ptrdiff_t n'est pas renseigné dans K&R à la page de stdlib.h, à moins que je ne me fourvoie. C'est parce qu'il est apparu dans une version postérieure de stdlib ou bien K&R n'est pas exhaustif ? |
Le K&R, c'est le C des cavernes, ça s'est quand même étoffé depuis.
Une remarque en passant:
Citation : Pointer arithmetic cannot be performed on void pointers because the void type has no size, and thus the pointed address can not be added to, although gcc and other compilers will perform byte arithmetic on void* as a non-standard extension. |
A+,
Marsh Posté le 18-01-2011 à 20:34:27
unecrepe a écrit : Merci pour le lien et le tuyau sur ptrdiff_t. Je conçois que les soustractions de pointeurs soient effectivement une source potentielle d'erreur sérieuse. Le type ptrdiff_t n'est pas renseigné dans K&R à la page de stdlib.h, à moins que je ne me fourvoie. C'est parce qu'il est apparu dans une version postérieure de stdlib ou bien K&R n'est pas exhaustif ? |
J'ai l'impression que tu te fourvoie (à moins que tu ais la première édition?): il est dans l'index de mon exemplaire qui référence la section 5.4 sur l'arithmétique des pointeurs, la section sur typedef où ptrdiff_t est donné comme un exemple et la section sur les opérateurs additifs dans la partie référence. En passant, l'en-tête qui définit ptrdiff_t est stddef.h, pas stdlib.h.
Citation : J'en profite pour ajouter à tout hasard que l'on peut aussi comparer deux adresses :[quotemsg] Uniquement si elles pointent vers le même objet. [quotemsg]Il faut par contre faire attention au fait que si je soustrais deux pointeurs du même type et que j'incrémente un pointeur d'un autre type de cette différence, il n'y a pas de conversions de taille. |
L'arithmétique sur les pointeurs, c'est pour aider l'indexation.
Marsh Posté le 17-01-2011 à 21:40:04
Bonjour à tous,
Je suis débutant en prog', je me pose une question sur l'emploi des pointeurs en C. Je la soumets à votre sagacité.
Supposons donné un tableau (disons d'entiers) et un pointeur vers un entier qui se promène dans ce tableau, comme dans :
Comment pourrais-je évaluer d'une manière élégante la position du pointeur dans mon tableau ? J'avais pensé à faire :
mais je reçois une erreur de typage.
J'ai lu qu'il n'existe pas d'opérateur de conversion d'un pointeur vers un entier, c'est pourtant un peu ce que je voudrais faire : obtenir la partie adresse du pointeur sous forme d'un entier (ou d'un long ptet' ) ?
Merci de votre lecture
ced'
Message édité par unecrepe le 17-01-2011 à 21:42:23