VS2005 et Variables Globales

Signaler
Messages postés
7
Date d'inscription
dimanche 30 décembre 2007
Statut
Membre
Dernière intervention
19 janvier 2008
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Bonjour,

Bon j'avance bien :)

J'ai un problème irrésolvable.
J'utilise Visual Studio 2005, et j'ai plusieurs fichiers qui incluent un fichiers "communs.h" qui contient tous mes #include et mes #define.
Jusque là pas de problème.

Cependant, cette après midi je voulais rajouter une variable globale dans "communs.h" et ca m'a fait pleins d'erreurs. Je crois que j'ai tout lu sur le sujet mais impossible de trouver une solution.
Selon ce que j'essaie ca me dit soit "variable déjà définie dans ..." soit "symbole externe non résolu..".
Mon projet n'inclue pas de librairie externe et est en multithreadé. Je n'utilise pas de MFC, mais que des API-32 (ce qui va faire plaisir à Brunews :-p )

Voici le contenu de mon fichier, le problème se trouvant au niveau de Tab et de Heap.

//---DEBUT---

#ifndef _COMMUNS_H_
#define _COMMUNS_H_

/* include */
#include <windows.h>
#include "Source_1.h"
#include "Source_2.h"

/* Define */
#define    PATH_SOURCE_1    "C:\\Fichier1"
#define    PATH_SOURCE_2    "C:\\Fichier2"

#define    TAILLE_MAX    4
#define    ACCEPTED_PATH    3

#endif // _COMMUNS_H_

    /* C'est eux qui posent problème :( */

    char AcceptedFormatsList[ACCEPTED_PATH][2][MAX_PATH]= {

    { "C:\\Dossier1",    "C:\\Dossier2" },

    { "D\\Dossier1",    "D:\\Dossier2" },

    { "E:\\Dossier1",    "E:\\Dossier2" }

    };


    HANDLE heap;

//---FIN---

Aidez moi s'il vous plait, plus tard il y aura 100 PATH et 10 fichier cpp, et je vais pas copier coller ca a chaque modif.
Merci d'avance. :-D

7 réponses

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Simplement ceci devrait régler tous tes problèmes:
    const
char AcceptedFormatsList[ACCEPTED_PATH][2][MAX_PATH]= {
    { "C:\\Dossier1",    "C:\\Dossier2" },
    { "D\\Dossier1",    "D:\\Dossier2" },
    { "E:\\Dossier1",    "E:\\Dossier2" }
    };

Si ce n'est pas le cas, ou si tu veux pas rendre la variable constante:
    static char AcceptedFormatsList[ACCEPTED_PATH][2][MAX_PATH] = {

    { "C:\\Dossier1",    "C:\\Dossier2" },

    { "D\\Dossier1",    "D:\\Dossier2" },

    { "E:\\Dossier1",    "E:\\Dossier2" }

    };

Ou encore:

    extern char AcceptedFormatsList[ACCEPTED_PATH][2][MAX_PATH];
Puis dans le .cpp:
     char AcceptedFormatsList[ACCEPTED_PATH][2][MAX_PATH] = {


    { "C:\\Dossier1",    "C:\\Dossier2" },


    { "D\\Dossier1",    "D:\\Dossier2" },


    { "E:\\Dossier1",    "E:\\Dossier2" }


    };

Dans le cas ou tu génères un exécutable, je saurais pas te donner la différence entre le "static" et le "extern".

Perso, je préfère la première solution (cad le simple "const") pour ce genre de donnée.
Messages postés
65
Date d'inscription
vendredi 10 février 2006
Statut
Membre
Dernière intervention
21 octobre 2009

'static' est une valeur qui est valable pour le programme complet jusqu'a ce qu'on change la valeur.
Alors que 'extern' dit simplement que la variable et sa définition sont dans un autre fichier.
Bye
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
static permet de declarer une variable accesible seulement dans le fichier ou elle a été declarer, extern permet d'acceder depuis un fichier source a une variable déclaré ds un autre fichier
ex:
ds test.c:
static BYTE i[] = { 'T', 'e', 's', 't' };
int j = 1234;
void __stdcall GetI(BYTE* Ret)
{
memcpy(Ret, i, sizeof(i));
}

void __stdcall PrintJ(void)
{
printf("%i\n", j); // si on change la valeur de j ds main.c, elle change ici aussi..
}

ds main.c:
void __stdcall GetI(BYTE* Ret);
void __stdcall PrintJ(void);

int main(void)
{
BYTE Test[4];
extern int j;
//printf("%s\n", i); Provoque une erreur i non declarer..
GetI(Test);
printf("%s\n", Test);
printf("j = %i\n", j);
j = 2008;
PrintJ();
system("PAUSE");
return 0;
}

Neo_Fr
Messages postés
7
Date d'inscription
dimanche 30 décembre 2007
Statut
Membre
Dernière intervention
19 janvier 2008

Ok, merci beaucoup les gars ;)
Très bonnes explications, je comprend mieux maintenant.


Avec const ca marche super pour mon tableau, et pour le heap j'utilise un extern, ca bug mais ca compile donc ca doit venir de moi.

Je vais me débrouiller avec ça.


reMerci.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
rajouter une variable globale dans "communs.h"


NON, on ne met pas de variable dans un h
Variables dans un c ou cpp et leurs inclusions via un h.


common.c
#include "common.h"


SITE currSite;
int v = 0;
char szappname[] = "test";


------------
common.h
#ifndef COMMON_H
#define COMMON_H


#define _WIN32_WINNT 0x0600
#include <windows.h>


#define TYPESMAX      10


typedef struct _SITE {
  DWORD codSite;
  DWORD plaaID;
} SITE, *LPSITE;


extern SITE currSite;
extern char szappname[];


#endif

ciao...
BruNews, MVP VC++
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
"NON, on ne met pas de variable dans un h"
=> Oui et non. Autant une variable, je suis d'accord, mais ici, on peut pas vraiment dire qu'il s'agit d'une variable une fois déclarée "constante" (surtout dans le cas de chaine de caractères). Enfin tfacon, mettre dans le .c/.cpp, ca coute rien.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
bien sur mais il doit prendre de bonnes habitudes.

ciao...
BruNews, MVP VC++