2009-03-18 2 views
1

Je fais face à une erreur bizarre suivante.Erreur étrange lors de l'exécution d'un code C dans MSVC 2005

J'ai un espace de travail dans MSVS2005 de tout le code C. J'ai déclaré une variable globale dans un fichier C. (fichier1.c) Ce fichier a la fonction main() dans laquelle, j'initialise la valeur de cette variable = 0. Dans un autre fichier C (fichier2.c). De la main il y a un appel de fonction à une fonction (func1 dans file2.c) qui définit la valeur de cette variable globale à 1. Dans file2.c j'ai déclaré la variable globale comme "extern .." et y ai accédé. Mais ce que j'ai remarqué est que dans le moment de la fonction principale l'exécution du code entre dans la fonction func2, je vois dans la fenêtre de surveillance que l'adresse de cette variable globale est changée en une adresse totalement différente (Dans la fenêtre de surveillance). . Par conséquent, lorsque la valeur de cette variable est définie sur 1, elle écrit la valeur 1 sur une adresse mémoire tout à fait différente. Donc quand plus tard j'utiliserai cette variable pour vérifier une condition if (si variable == 1), elle montrera toujours la valeur de 0 et ne satisfera pas la condition if et ne prendra pas ce chemin de code, où il devrait avoir pris ce chemin. Solution: J'ai déclaré cette variable dans l'une de mes structures globales existantes, puis j'ai accédé à cette variable pour effectuer les mêmes opérations; le code fonctionne comme prévu.

Alors, quelle pourrait être l'explication de l'erreur qui provoque le changement de l'adresse de la variable globale si elle est déclarée comme globale dans un fichier C? Peu importe dans quel fichier * .c je le déclare et quel fichier j'y accède en utilisant "extern", le résultat est le même changement d'adresse de variable globale et l'opération errorneous suivante. Aucune option d'optimisation n'est activée.

Merci,

-AD

+0

Il doit y avoir une erreur triviale. Voulez-vous s'il vous plaît rouler dans des extraits de code? – sharptooth

+0

Je pense que votre question serait beaucoup plus facile à lire si vous n'essayez pas de décrire le code mais insérez directement les parties importantes ici. – schnaader

Répondre

0

Peut-être essayer déclarant volatile (pas sûr si c'est encore valable pour GLOBALS) et désactiver toutes les optimisations du compilateur dans le cas où il devient difficile d'une certaine manière.

0

Si la variable a une adresse différente dans différentes unités de traduction, vous n'en voyez pas une mais au moins deux variables de même nom. Cause la plus courante: Vous avez peut-être déclaré accidentellement une variable locale sur la pile portant le même nom. Vérifiez votre code pour cela. Si les variables sont vraiment globales, l'éditeur de liens devrait se plaindre si deux unités de traduction contiennent le même symbole.

Si cela ne vous aide pas, et si vous voyez encore plusieurs copies du même nom de symbole, il est probablement préférable de jeter un coup d'œil sur le fichier map (peut être activé dans les paramètres de l'éditeur de liens).

Tous les symboles externes sont listés avec leur nom, adresse et (le plus important dans votre cas) le fichier objet qui les contient.

Les adresses dans le fichier carte peuvent être simplement des offsets. Dans ce cas, faites tous vos calculs relatifs à un symbole connu pour n'exister qu'une seule fois. le principal() entrypoint pourrait être bon pour cela.

0

Probablement une faute de frappe ou quelque chose de similaire dans votre code. Essayez cette démo de travail:

fichier1.c

int variable; 
void fun1(int k); 

int main() 
{ 
    printf("%d\n", variable); 
    fun1(4); 
    printf("%d\n", variable); 
} 

fichier2.c

extern int variable; 

void fun1(int k) 
{ 
    variable = k; 
} 

Sortie:

0 
4 

Pour compiler:

cl.exe file1.c file2.c 
1

Ne peut deviner sans voir réellement le code, mais voici 2 possibilités:

  1. mondial variable est caché par un local soit dans main() ou func2() (ou peut-être func1() - la question mentionne mais je soupçonne que c'est une faute de frappe - c'est pourquoi couper et coller le code est très important);
  2. Vous déclarez par erreur la variable globale static dans file1.c et avez un initialiseur sur votre déclaration extern dans file2.c. Avoir un initialiseur sur la déclaration extern entraînera également cette définition à être une définition.
Questions connexes