Résolu : variable modifiée par l'affectation d'une autre variable - C - Programmation
Marsh Posté le 22-05-2010 à 21:36:13
ohcto a écrit : Bonjour (ou bonsoir)
|
C'est quoi les types de B, C et D (je présume que A est de type int) ?
ohcto a écrit : Pour comprendre ce qui se passe, j'ai passé l'addresse de A en argument dans fonction1
|
J'espère que le tableau cache_SA est de taille suffisante (au-moins 5 struct cacheline_SA) !!!
ohcto a écrit : Pour avoir à peu près une idée ( mais au final ça me dit pas grand chose), j'ai affiché les addresses des variables en question : |
Ben oui. Tu n'as pas "une" structure mais un tableau de "n" structures. Faut faire 0xbfefec60 + n * 0x1e0 !!!
Et si je fais 0xbfefec60 + 3 * 0x1e0 j'arrive pile poil sur 0xbfeff3e0 qui est l'adresse de cache_SA[4].tag et qui est aussi à seulement 12 octets de A !!! En dehors de cette variable A, je me demande bien quelles autres malheureuses variables vont se faire écraser par les zones value, dirty et active situées juste après tag...
ohcto a écrit : Vous auriez une idée pour expliquer ce phénomène et corriger mon code pour ne pas avoir ce problème ? |
Oui, pas mauvaise idée. Et si t'es sous système Unix/Linux, tu pourras même rajouter un 2>/dev/null après le lancement de ton exécutable comme ça tu ne seras pas embêté par les messages d'erreurs s'il y en a...
Quand il y a un soucis vaut mieux trouver sa cause pour le faire disparaitre plutôt que de l'esquiver.
De toute façon tu décris ici un cas typique de comportement indéterminé. Style t'as alloué 10 et tu remplis 11. Déjà mis à part mes questions précédentes, si on pouvait avoir le code de "fonction" ce serait un plus mais à mon avis l'idée du tableau [4] est une bonne piste...
Marsh Posté le 22-05-2010 à 21:38:10
Donc, en deux mots, malloc foireux.
Marsh Posté le 22-05-2010 à 21:54:26
Sve@r a écrit : |
B, C et D c'était pour simplifier, la fonction en elle même c'est ça :
Code :
|
et voici son appel :
Code :
|
Sve@r a écrit : |
comment ça ?
le tableau cache_SA est déclaré ainsi :
Code :
|
.................................. je crois que je viens à l'instant de trouver mon erreur (en rouge) !!
Sve@r a écrit : |
Sve@r a écrit : |
vi, ton diagnostic était le bon
non, A n'est bien sûr pas globale...
_iOn_ a écrit : Donc, en deux mots, malloc foireux. |
j'utilise pas malloc
Marsh Posté le 22-05-2010 à 22:01:26
Sve@r a écrit : |
merci tu m'as aidé à trouver mon problème
dédicément, j'ai passé des heures à vérifier re-vérifier en croyant n'avoir fait aucune erreur et finalement c'était juste là, devant mes yeux
Marsh Posté le 22-05-2010 à 22:03:06
Bon ben voilà quoi. Tu marques "RESOLU" dans le titre, ensuite tu cours vite te cacher loin de la communauté scientifique qui te contemple et qui te juge et demain tout sera oublié
Marsh Posté le 22-05-2010 à 22:05:06
Sve@r a écrit : |
c'est bon je suis déjà caché
Marsh Posté le 22-05-2010 à 19:13:11
Bonjour (ou bonsoir)
J'ai un problème qui me casse la tête et que je vais essayer de vous décrire le plus simplement possible :
J'ai une variable A qui vaut 1792,
j'appelle une fonction qui ne prend pas A en argument,
et juste après, si j'affiche A, la valeur a changé, la variable vaut 3.
Donc en gros, si mon code est (les noms des variables et fonctions sont fictifs car pas importants) :
ça donne :
1792
3
Pour comprendre ce qui se passe, j'ai passé l'addresse de A en argument dans fonction1
j'ai remarqué en faisant des printf partout que le changement de valeur se faisait au niveau d'une ligne :
avec index = 4, w = 3 et new_tag = 3
cache est de type struct cacheline_SA avec :
On dirait que la valeur (3) n'a pas été enregistrée là où il faut dans la mémoire ( surprenant! ) et a "empiété" sur ma variable A.
Pour avoir à peu près une idée ( mais au final ça me dit pas grand chose), j'ai affiché les addresses des variables en question :
A est à l'addresse 0xbfeff3ec
cache_SA est à l'addresse 0xbfefec60
cache_SA[4].tag est à l'addresse 0xbfeff3e0
la taille de ma structure ( d'après sizeof ) est de 480B et 0xbfefec60 + 0x1e0 (480) = 0xbfefee40 < 0xbfeff3ec (addresse de A)
donc ça devrait pas poser de problème, cela dit je me trompe peut être car je suis pas sûr de mon calcul...
Vous auriez une idée pour expliquer ce phénomène et corriger mon code pour ne pas avoir ce problème ?
Il y a une solution bricolage qui serait de sauvegarder la valeur de A à une autre adresse et puis la ressortir après l'execution de la fonction1, mais bon... c'est vraiment pas propre comme solution...
Merci!
Message édité par ohcto le 22-05-2010 à 22:05:36