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:
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
Citation:
.\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:
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
Citation:
Édition des liens en cours...
AddCandidate.obj : error LNK2005: _KarpPartitioning déjà défini(e) dans Activate.obj
Citation:
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
Citation:
.\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
Code:
KarpPartitioning = 0;
J'ai beau relire mes bibles, je n'en retrouve pas mon latin (je vais écouter du Brassens pour compenser ;) )
Merci de votre aide
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
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 mais impossible de regrouper les déclarations dans un seul bloc
Code:
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:
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