IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VC++ .NET Discussion :

VC++9Express redéfinition de variables globales et externes


Sujet :

VC++ .NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 81
    Points : 51
    Points
    51
    Par défaut VC++9Express redéfinition de variables globales et externes
    bonjour,

    Je rencontre un problème qui est trivial mais j'en perds mon latin informatique avec VisualStudio

    Je reprends un vieux projet C trouvé sur LKH
    et essaye de l'intégrer dans une solution VisualStudio Express 2008

    La compilation et l'execution du projet en version d'execution "release" fonctionne
    Lorsque je parametre un projet en version de déboggage "debug", le programme plante à la première utilisation de la variable récupérée dans la ligne de commande "argv[1]"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(int argc, char *argv[])
    {
        if (argc >= 2){
          ParameterFileName = argv[1];
        }
    }
    Pour tenter de comprendre en utilisant le deboggueur, je décide donc de passer en C++ en changeant simplement les extensions des codes sources de ".c" en ".cpp"
    Là, les choses se compliquent :

    Tous les modules utilisent le même fichier de déclaration avec la directive du préprocesseur #include car toutes les variables et toutes les fonctions sont déclarées de manière globale
    A la compilation du deuxième module, le compilateur C++ me dit que les variables sont déja définies dans le premier module et ainsi de suite pour toutes les variables globales de tous les modules
    .\SRC\LKHmain.cpp(5) : error C2086: 'int KarpPartitioning'*: redéfinition
    c:\calc_vdc\linkernighan\lkhwin-2.0.3\src\LKHmain.h(264)*: voir la déclaration de 'KarpPartitioning'
    Je ne sais pas comment distinguer les 'déclarations' de la 'définition'

    J'essaye donc avec de la compilation conditionnelle de déclarer mes variables et fonctions comme des éléments externes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" { ... int KarpPartitioning; ... }
    A l'édition des liens, j'ai le message d'erreur d'une variable qui est déjà définie ou qui est référencée ailleurs
    Édition des liens en cours...
    AddCandidate.obj : error LNK2005: _KarpPartitioning déjà défini(e) dans Activate.obj
    SolveRoheSubproblems.obj : error LNK2019: symbole externe non résolu _Random référencé dans la fonction _SolveRoheSubproblems
    Lorsque je choisi un module dans lequel insérer les déclarations non externes, je retrouve la première erreur
    .\SRC\LKHmain.cpp(5) : error C2086: 'int KarpPartitioning'*: redéfinition
    Donc, je ne comprends pas ce mélange de déclaration et de définition, entre le C et le C++ et entre les modules
    Moi qui pensait que l'on pouvait répéter autant de déclarations que voulues c'est à dire autant de fois que de modules dans le projet
    Et que la définition d'une variable se faisait à son initialisation, a savoir dans le main dans ce cas de figure
    J'ai beau relire mes bibles, je n'en retrouve pas mon latin (je vais écouter du Brassens pour compenser )
    Merci de votre aide

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    ON NE CHANGE PAS UNE EXTENSION SANS SAVOIR CE QUE L'ON FAIT MALHEUREUX !!!

    Le C et le C++ ne sont pas tout à fait identiques... certaines règles de C nécessite des transformations pour C++.
    Ce n'est pas un problème inhérent à Visual Studio.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Le debuggeur VS marche aussi avec des fichiers C.
    Enfin, au moins il marchait il y a près de 10 ans sous VC++6, la dernière fois que j’ai vu du C, du vrai.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 382
    Points : 4 936
    Points
    4 936
    Par défaut
    je ne sais pas ce que tu as téléchargé sur le site, j'ai dl ça : http://www.akira.ruc.dk/~keld/resear...HWin-2.0.3.zip

    j'ai lancé le .sln et ça marche tant en debug qu'en release.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 81
    Points : 51
    Points
    51
    Par défaut sous problème : arguments argc et argv[] avec des valeurs incohérentes
    j'ai enfin adapté/migré mon projet de "C" à "C++" sous VC++v9
    et le verdict est toujours le même :

    si dans les parametres du projet j'introduis un argument à la ligne de commande c:\monfichier.txt

    dans la version 'release' le main reçoit un parametre argc = 2 et agrv[1]="c:\monfichier.txt"

    dans la version 'debug' le main reçoit un parametre argc = 2024226254 ou n'importe quelle autre valeur et un pointeur null pour argv[1]

    la seule solution est de modifier les valeurs de argc et agv[] dans le main ...

    je ne sais pas quoi dire d'autre que c'est un problème lié à l'IDE

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 81
    Points : 51
    Points
    51
    Par défaut sous problème : déclarer les variables globales en extern "C" pour passer de .c à .cpp
    pour migrer mon projet de "C" à "Cplusplus", j'ai déclaré et défini toutes mes variables globales et prototypes de fonction en
    extern "C"
    mais impossible de regrouper les déclarations dans un seul bloc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    extern "C"{
    ...
    v1;
    v2;
    ...
    }
    il a fallu que je le spécifie ligne par ligne, variable après variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    extern "C" v1;
    extern "C" v2;
    ...
    ce qui me semble très étonnant

    là encore je ne sais dire quoi d'autre que c'est lié à l'IDE VC++v9

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Vous compliquez inutilement le problème avec le C++.
    Extern "C" est pour piloté le mangling de en C++ pour qu'il se conforme au mangling C.
    Donc pas d'extern "C" {} SVP.

    Utilisez correctement le mot clé extern du C, pas du C++.

    http://msdn.microsoft.com/en-us/libr...38(VS.60).aspx
    Ne confondez pas la première syntaxe avec les 2 autes.

    P.S.: les globals, c'est pourri, justement à cause de ces problèmes.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/10/2009, 10h52
  2. variable globale definie dans un .js externe
    Par master_kb2 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/04/2008, 17h58
  3. STL List et variable globale (extern)
    Par flipper203 dans le forum SL & STL
    Réponses: 9
    Dernier message: 04/07/2006, 14h20
  4. Utilisation variable globale, extern...
    Par mamok dans le forum MFC
    Réponses: 3
    Dernier message: 29/03/2006, 10h50
  5. variable global fichier externe?
    Par molesqualeux dans le forum C
    Réponses: 4
    Dernier message: 01/02/2006, 16h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo