Re: Poiteur en gcc

Page principale

Répondre à ce message
Auteur: Pierre Mazein
Date:  
À: guilde
Sujet: Re: Poiteur en gcc
Bonsoir,

Ceci :

(((set -> cross_set) + i_cros) -> lines + i_line)
est très suspect.

Vous devriez vous abstenir de faire de l'arithmétique sur les pointeurs.
Je sais que c'est l'un des plaisirs du C, mais c'est une mauvaise pratique.

N'hésitez pas à créer des pointeurs intermédiaires, des variables
intermédiaires pour améliorer la lisibilité et la maintenabilité.

Par curiosité, que donne le compilateur avec l'option -Wall ?

Pierre

Le 09/03/2020 à 21:45, Patrick Dupre a écrit :
> Bonsoir,
>
> J'en perds mon latin.
> Il y a sens doute une explication, mais je ne trouve pas.
>
> En ayant
> current_cross = (set -> cross_set) + i_cros ;
> et
> cur_line = (current_cross -> lines) + i_line ;
> cur_cross et cur_line sont bien declares comme pointeurs (differents) sur les bonnes structures
>
>
> la valeur de cur_line devient fausse ou moins pour i_line = 1
>
> J'ai fait le test avec ces 3 lignes de code successive
> dans la boucle qui incremente i_line
>
> if ((((set -> cross_set) + i_cros) -> lines + i_line) != ((current_cross -> lines) + i_line)) printf ("Issue 1 %d\n", i_line) ;
> if (((set -> cross_set) + i_cros) -> lines != current_cross -> lines) printf ("Issue 2 %d\n", i_line) ;
> if (((set -> cross_set) + i_cros) -> lines + i_line != current_cross -> lines + i_line) printf ("Issue 3 %d\n", i_line) ;
>
>
> Le test 2 est toujours correct
> Mais les tests 1 et 3 sont systematiquement en erreur pour i_line = 1 (en fait ceux sont les meme tests).
>
> Pourquoi le sommation avec i_line est-elle fausse ?
> En fait
> (set -> cross_set) + i_cros) -> lines + i_line
>
> semble bien correct, mais pas
> current_cross -> lines + i_line
>
> Est-ce que je dois caster ?
>
>
> ===========================================================================
>   Patrick DUPRÉ                                 | | email: pdupre@???
>   Laboratoire interdisciplinaire Carnot de Bourgogne
>   9 Avenue Alain Savary, BP 47870, 21078 DIJON Cedex FRANCE
>   Tel: +33 (0)380395988
> ===========================================================================

>
>