Problème avec l'algorithmique des pointeurs - C - Programmation
Marsh Posté le 29-03-2007 à 08:12:04
tu fais ( ou tu caste ) un pointeur en void *
mais c'est super crade et tres dangereux
Marsh Posté le 29-03-2007 à 09:23:04
tu peux faire
char *tmp = (char *) var;
var = (int *) (tmp + 2);
Au passage tu perds l'adresse fournie par le malloc.
Quel est l'intérêt ?
Marsh Posté le 29-03-2007 à 12:28:41
AthlonSoldier a écrit : Bonjour, J'ai un petit problème avec l'algorithmique des pointeurs en C. |
Tu veux sans doute dire l'arithmétique des pointeurs...
La confusion règne dans les esprits... La Bête a commencé son Oeuvre, l'Apocalypse est en marche...
Marsh Posté le 29-03-2007 à 12:45:56
Oui l'arithmétique bien sur
Merci à vous.
Entre temps, j'ai aussi trouvé la solution du "cast", je fais maintenant :
Code :
|
Mais comme tu dis flo850, la solution semble bien crade. Quelle est donc la solution "propre" ?
Marsh Posté le 29-03-2007 à 13:08:14
AthlonSoldier a écrit : Mais comme tu dis flo850, la solution semble bien crade. Quelle est donc la solution "propre" ? |
Définit ce que tu veux faire (je parle d'objectif, pas de solution).
Marsh Posté le 29-03-2007 à 13:17:23
Je dois calculer le pointeur qui me permet d'aller X octets derrière une structure quelconque.
Imaginons que j'ai :
Code :
|
Donc là je veux avoir le new_ptr à "t_test + sizeof(t_test) + 3 octets" alors qu'avec l'arithmétique des pointeurs je tombe beaucoup plus loin
Marsh Posté le 29-03-2007 à 13:24:29
mais acceder au bloc suivant est asssez reiqué
a moins que tu n'ai alloué un tableau de données, tu ne pexu pas etre sur de tomber sur une zone autorisée
Marsh Posté le 29-03-2007 à 13:36:27
AthlonSoldier a écrit : Je dois calculer le pointeur qui me permet d'aller X octets derrière une structure quelconque. Imaginons que j'ai :
Donc là je veux avoir le new_ptr à "t_test + sizeof(t_test) + 3 octets" alors qu'avec l'arithmétique des pointeurs je tombe beaucoup plus loin |
Utilise un char *p. Le déplacement sera alors de 1 à chaque incrément.
J'espère que tu sais ce que tu fais, parce que "aller X octets derrière une structure quelconque.
", je le sens mal.
Et si tu exposais plutôt ton vrai problème, parce que là, ça sent la solution vaseuse à un vrai problème non exposé...
Marsh Posté le 29-03-2007 à 14:17:08
Si j'utilise un char *p je ne peux pas acceder aux elements de ma structure quand "je sais" que le pointeur pointe sur une structure valide.
Il n'y a pas de "vrai problème", le "problème" a été exposé.
EDIT : Et vous inquiétez pas, je sais exactement où je vais dans le "heap"
Marsh Posté le 29-03-2007 à 14:55:51
AthlonSoldier a écrit : Si j'utilise un char *p je ne peux pas acceder aux elements de ma structure quand "je sais" que le pointeur pointe sur une structure valide. |
Puis-je te renvoyer à ce que j'ai écrit ce matin ?
Code :
|
Marsh Posté le 29-03-2007 à 14:58:05
t'es à peu près sûr d'avoir une erreur de segmentation si t'es sous Linux en faisant un truc pareil.
Marsh Posté le 29-03-2007 à 23:01:29
Trap D a écrit : Puis-je te renvoyer à ce que j'ai écrit ce matin ?
|
Ca revient exactement au même que de le caster directement en (char *)...mais en créant une variable intermédiaire. Donc désolé mais je vois pas "le mieux"
Marsh Posté le 29-03-2007 à 23:02:22
Je pense que je vais rester sur du cast en (char *), sauf si quelqu'un a une meilleur solution.
Merci à vous en tout cas
Marsh Posté le 30-03-2007 à 08:20:28
AthlonSoldier a écrit : Ca revient exactement au même que de le caster directement en (char *)...mais en créant une variable intermédiaire. Donc désolé mais je vois pas "le mieux" |
Au moins tu gardes l'ancienne adresse, ce qui est utile pour la libération de la zone mémoire allouée par malloc.
D'autre part, j'avais répondu à ceci :
Citation : Si j'utilise un char *p je ne peux pas acceder aux elements de ma structure quand "je sais" que le pointeur pointe sur une structure valide. |
Marsh Posté le 30-03-2007 à 14:48:46
Pas besoin de conserver le pointeur, je suis sur un maillon d'une liste chainees et je peux retrouver ce pointeur à tout instant
Marsh Posté le 30-03-2007 à 15:10:04
AthlonSoldier a écrit : Oui l'arithmétique bien sur
|
surtout fausse.
Et attention aux problèmes d'alignements.
Marsh Posté le 30-03-2007 à 16:17:34
Et donc quelle est la solution "juste" ?
Marsh Posté le 30-03-2007 à 16:35:55
AthlonSoldier a écrit : Et donc quelle est la solution "juste" ? |
Définir exactement ce que tu veux faire (spécification) et prendre les moyens de le réaliser correctement (conception).
Tant que tu n'exposes pas le vrai problème, on ne peut que spéculer et bricoler. Je rappelle que l'informatique n'est qu'un outil au service d'un 'métier'. De quel 'métier' s'agit-il ? De quelle application Quel est le but de la manoeuvre ? Quels sont les entrées, les traitements, les sorties ?
Bref, il faut cesser de bricoler et passer à une attitude professionnelle.
Marsh Posté le 02-04-2007 à 09:56:53
AthlonSoldier a écrit : Si j'utilise un char *p je ne peux pas acceder aux elements de ma structure quand "je sais" que le pointeur pointe sur une structure valide. |
Ben si tu peux !!!
Je reprends ton exemple de structure
typedef struct s_test{ |
Si tu es certain (je me demande bien comment) que ton "p" est bien sur une structure valide, tu peux accéder à l'élément que tu veux (ex: val1) en demandant "((t_test)*p).val1".
Voilà - Ca c'était la façon d'écrire. Mais c'est une façon qu'on n'utilise jamais car généralement on se déplace de structure en structure en utilisant un pointeur sur le type de la structure. Là on est vraiment certain qu'on est bien sur la structure en question et on n'a pas besoin de ce cast. En fait, pour résumer la question que tout le monde se pose: pourquoi as-tu donc besoin de te déplacer en octets pour retomber au final "certainement" sur une structure valide alors que l'arithmétique des pointeurs fait que tu tomberas "toujours" sur une structure valide ???
[EDIT]
Je pense qu'il vaut mieux remplacer
((t_test)*p).val1 |
par
((t_test*)p)->val1 |
...
Marsh Posté le 02-04-2007 à 14:57:34
ReplyMarsh Posté le 02-04-2007 à 15:07:27
AthlonSoldier a écrit : Parceque je (re)code les fonctions d'allocations de mémoire de la libc. |
Ah, on va peut enfin connaitre les vrais raisons de ce bidouillage...
Marsh Posté le 02-04-2007 à 15:31:41
Emmanuel Delahaye a écrit : Ah, on va peut enfin connaitre les vrais raisons de ce bidouillage... |
Tout le monde est suspendu au forum en attente de la réponse...
Marsh Posté le 02-04-2007 à 15:55:14
Sve@r a écrit : Tout le monde est suspendu au forum en attente de la réponse... |
Marsh Posté le 28-03-2007 à 23:33:44
Bonjour,
J'ai un petit problème avec l'algorithmique des pointeurs en C.
Je ne sais pas comment "désactiver" temporairement ce comportement...je m'explique :
Dans ce cas le compilateur va faire pointer "var" vers (var + (sizeof(*var) * 2)) soit (var + 8) !
Alors que je veux le faire pointer vers (var + 2 octets) et non (var + 8 octets)...
Aidez moi
Message édité par AthlonSoldier le 28-03-2007 à 23:34:50