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

  FORUM HardWare.fr
  Programmation
  C

  Problème avec l'algorithmique des pointeurs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème avec l'algorithmique des pointeurs

n°1535496
AthlonSold​ier
Feel the power
Posté le 28-03-2007 à 23:33:44  profilanswer
 

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
mood
Publicité
Posté le 28-03-2007 à 23:33:44  profilanswer
 

n°1535558
flo850
moi je
Posté le 29-03-2007 à 08:12:04  profilanswer
 

tu fais ( ou tu caste ) un pointeur en void *
 
mais c'est super crade et tres dangereux  

n°1535580
Trap D
Posté le 29-03-2007 à 09:23:04  profilanswer
 

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 ?

n°1535750
Emmanuel D​elahaye
C is a sharp tool
Posté le 29-03-2007 à 12:28:41  profilanswer
 

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/
n°1535760
AthlonSold​ier
Feel the power
Posté le 29-03-2007 à 12:45:56  profilanswer
 

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:

n°1535766
Emmanuel D​elahaye
C is a sharp tool
Posté le 29-03-2007 à 13:08:14  profilanswer
 

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/
n°1535768
AthlonSold​ier
Feel the power
Posté le 29-03-2007 à 13:17:23  profilanswer
 

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]

n°1535771
flo850
moi je
Posté le 29-03-2007 à 13:24:29  profilanswer
 

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

n°1535778
Emmanuel D​elahaye
C is a sharp tool
Posté le 29-03-2007 à 13:36:27  profilanswer
 

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/
n°1535802
AthlonSold​ier
Feel the power
Posté le 29-03-2007 à 14:17:08  profilanswer
 

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
mood
Publicité
Posté le 29-03-2007 à 14:17:08  profilanswer
 

n°1535842
Trap D
Posté le 29-03-2007 à 14:55:51  profilanswer
 

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

n°1535845
Dumbledore
Posté le 29-03-2007 à 14:58:05  profilanswer
 

t'es à peu près sûr d'avoir une erreur de segmentation si t'es sous Linux en faisant un truc pareil.

n°1536143
AthlonSold​ier
Feel the power
Posté le 29-03-2007 à 23:01:29  profilanswer
 

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

n°1536146
AthlonSold​ier
Feel the power
Posté le 29-03-2007 à 23:02:22  profilanswer
 

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
n°1536192
Trap D
Posté le 30-03-2007 à 08:20:28  profilanswer
 

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.

n°1536431
AthlonSold​ier
Feel the power
Posté le 30-03-2007 à 14:48:46  profilanswer
 

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
n°1536443
Taz
bisounours-codeur
Posté le 30-03-2007 à 15:10:04  profilanswer
 

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.

n°1536473
AthlonSold​ier
Feel the power
Posté le 30-03-2007 à 16:17:34  profilanswer
 

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

Message cité 1 fois
Message édité par AthlonSoldier le 30-03-2007 à 16:17:50
n°1536478
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-03-2007 à 16:35:55  profilanswer
 

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/
n°1537114
Sve@r
Posté le 02-04-2007 à 09:56:53  profilanswer
 

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.
n°1537342
AthlonSold​ier
Feel the power
Posté le 02-04-2007 à 14:57:34  profilanswer
 

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

n°1537353
Emmanuel D​elahaye
C is a sharp tool
Posté le 02-04-2007 à 15:07:27  profilanswer
 

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/
n°1537398
Sve@r
Posté le 02-04-2007 à 15:31:41  profilanswer
 

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.
n°1537421
Emmanuel D​elahaye
C is a sharp tool
Posté le 02-04-2007 à 15:55:14  profilanswer
 

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/
mood
Publicité
Posté le   profilanswer
 


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

  Problème avec l'algorithmique des pointeurs

 

Sujets relatifs
Probleme de différence entre IE et firefoxProblème de thread avec les sockets en .NET
ACCESS : Problème pour importer champ dateProblème de date
Vecteurs de pointeursProblème pour la création d'un trigger dans MySQL
Problème avec MatlabPetit Problème bizarre :)
Curseur rond, problème de positionprobleme accents caratere en C
Plus de sujets relatifs à : Problème avec l'algorithmique des pointeurs


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