Problème avec l'algorithmique des pointeurs

Problème avec l'algorithmique des pointeurs - C - Programmation

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 :
 

Code :
  1. int *var;
  2. var = malloc(100);
  3. var = var + 2


 
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  [:zoutte]

Message cité 1 fois
Message édité par AthlonSoldier le 28-03-2007 à 23:34:50
Reply

Marsh Posté le 28-03-2007 à 23:33:44   

Reply

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  

Reply

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 ?

Reply

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...

 


Message édité par Emmanuel Delahaye le 29-03-2007 à 12:30:00

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 29-03-2007 à 12:45:56    

Oui l'arithmétique bien sur  :D  
Merci à vous.
 
Entre temps, j'ai aussi trouvé la solution du "cast", je fais maintenant :

Code :
  1. int *var;
  2. var = malloc(100);
  3. var = (int *)((void *)var + 2)


 
Mais comme tu dis flo850, la solution semble bien crade. Quelle est donc la solution "propre" ?  :whistle:

Reply

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).
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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 :
  1. typedef struct s_test
  2. {
  3.    int   val1;
  4.    int   val2;
  5.    int   val3;
  6. }                  t_test;
  7. // En mémoire j'ai déjà un pointeur sur un type "t_test" nommé "abc"
  8. void *new_ptr;
  9. new_ptr = (void *)((abc + 1) + 3);


 
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  [:ddr555]

Reply

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

Reply

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 :

Code :
  1. typedef struct s_test
  2. {
  3.    int   val1;
  4.    int   val2;
  5.    int   val3;
  6. }                  t_test;
  7. // En mémoire j'ai déjà un pointeur sur un type "t_test" nommé "abc"
  8. void *new_ptr;
  9. new_ptr = (void *)((abc + 1) + 3);
 

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  [:ddr555]


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é...


Message édité par Emmanuel Delahaye le 29-03-2007 à 13:37:21

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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"  :o

Message cité 2 fois
Message édité par AthlonSoldier le 29-03-2007 à 14:19:16
Reply

Marsh Posté le 29-03-2007 à 14:17:08   

Reply

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. :)
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"  :o


Puis-je te renvoyer à ce que j'ai écrit ce matin ?

Code :
  1. char *tmp = (char *) var;
  2. var = (int *) (tmp + 2);

Reply

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.

Reply

Marsh Posté le 29-03-2007 à 23:01:29    

Trap D a écrit :

Puis-je te renvoyer à ce que j'ai écrit ce matin ?

Code :
  1. char *tmp = (char *) var;
  2. var = (int *) (tmp + 2);



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" :/

Reply

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


Message édité par AthlonSoldier le 29-03-2007 à 23:02:38
Reply

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.

Reply

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


Message édité par AthlonSoldier le 30-03-2007 à 14:49:46
Reply

Marsh Posté le 30-03-2007 à 15:10:04    

AthlonSoldier a écrit :

Oui l'arithmétique bien sur  :D  
Merci à vous.
 
Entre temps, j'ai aussi trouvé la solution du "cast", je fais maintenant :

Code :
  1. int *var;
  2. var = malloc(100);
  3. var = (int *)((void *)var + 2)


 
Mais comme tu dis flo850, la solution semble bien crade. Quelle est donc la solution "propre" ?  :whistle:


surtout fausse.
 
Et attention aux problèmes d'alignements.

Reply

Marsh Posté le 30-03-2007 à 16:17:34    

Et donc quelle est la solution "juste" ?  :??:

Message cité 1 fois
Message édité par AthlonSoldier le 30-03-2007 à 16:17:50
Reply

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.

 


Message édité par Emmanuel Delahaye le 30-03-2007 à 16:37:21

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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{
   int   val1;
   int   val2;
   int   val3;
} t_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

...


Message édité par Sve@r le 03-04-2007 à 19:28:08

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

Marsh Posté le 02-04-2007 à 14:57:34    

Parceque je (re)code les fonctions d'allocations de mémoire de la libc.  :o

Reply

Marsh 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.  :o


Ah, on va peut enfin connaitre les vrais raisons de ce bidouillage...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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...[:ddr555]


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

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...[:ddr555]


http://www.cartoonstock.com/newscartoons/cartoonists/tpr/lowres/tprn3l.jpg
:sleep:


Message édité par Emmanuel Delahaye le 02-04-2007 à 15:55:33

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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