| |
Consulter les messages sans réponse | Consulter les sujets actifs
| Auteur |
Message |
|
René Rhéaume
|
Publié: 05 Mai 2002, 15:18 |
|
Inscription : 07 Jan 2002, 22:14 Message(s) : 790 Localisation : Extrémité sud-ouest de Lévis
|
J'ai des problèmes avec la compilation séparée en C:
- Dans quel fichier dois-je placer mes défininssions de structures (struct NomStruct {...};) ? *.h ? *.c ? Les deux ? VC++ me retourne «error C2011: 'NoyauElement' : 'struct' type redefinition»
- Si je veux des variables et des fonctions locales à mon fichier, est-ce que je ne les mets pas dans mon fichier .h ?
- Comment faire pour mettre les mêmes prototypes dans un seul fichier ?
|
|
| Haut |
|
 |
|
Auron
|
Publié: 05 Mai 2002, 15:25 |
|
Inscription : 22 Fév 2002, 20:54 Message(s) : 738 Localisation : Montréal
|
|
(en général variable, struct, fonction ) si tu veux y accéder ailleur dans ton projet, tu le mets dans le .h, sinon dans le .c. Si tu mets des variables dans ton .h tu dois les définir extern et ensuite les définir (normalement)dans ton .c. Aussi tu devrais faire un typedef quand tu définis une struct en c.
|
|
| Haut |
|
 |
|
René Rhéaume
|
Publié: 05 Mai 2002, 15:44 |
|
Inscription : 07 Jan 2002, 22:14 Message(s) : 790 Localisation : Extrémité sud-ouest de Lévis
|
J'ai oublié de mentionner que mes définitions structures contiennent des pointeurs vers des instances du type que je définis (un arbre)
Code : struct NoyauElement { char nom[25 + 1]; unsigned char etat; unsigned char type; unsigned long valeur; unsigned char fanions; /* bit 0: suivant présent, bit 1: contenu présent */ } ;
struct Element { struct NoyauElement noyau; unsigned char selectionne; struct Element * contenu; struct Element * suivant; } ;
struct tdpElements /* «tableau dynamique» de pointeurs vers des éléments */ { short nbElem; struct Element ** ptrTabElements; } ;
|
|
| Haut |
|
 |
|
Kaltar
|
Publié: 06 Mai 2002, 08:53 |
|
Inscription : 30 Avr 2002, 09:02 Message(s) : 152
|
une definition de structure se fait par "typedef". Si tu ne fais pas ca, tu definis et tu declares ta structures en meme temps. Il faut que tu definisses ta structure dans ton .h et tu declare ta structure dans un seul fichier '.c'. Tu utilises "extern" dans tous les autres fichiers '.c'.
en francais:
dans ton .h:
-------------
typedef struct MaStructureDef {
int a;
char b;
MaStructureDef *pSuivant;
} MaStructureDef;
dans ton premier fichier .c :
------------------------------
#include "definitions.h"
MaStructureDef MaStructure; //declaration
etc...
dans tous les autres fichiers .c:
------------------------------------
#include "definitions.h"
extern MaStructureDef MaStructure; //fait reference a la declaration dans un autre fichier .c
---
Tu fais pareil avec toutes les autres structures.
ps.:il se peut que tu aies a declarer ta structure avec un 'struct'(blanc de memoire  ):
struct MaStructureDef MaStructure;
--
Kaltar
|
|
| Haut |
|
 |
|
cro
|
Publié: 06 Mai 2002, 09:39 |
|
Inscription : 08 Jan 2002, 14:51 Message(s) : 1337 Localisation : Québec
|
|
Je crois plutôt que ton problème est lié au include. Ta structure est déffinie dans un .h que tu essais d'inclure dans plusieurs .c, dont tu obtiens une redéfinition.
Si c'est effectivement ton problème, ajoute:
#ifndef blabla_h
#define blabla_h
// ton code
#endif
|
|
| Haut |
|
 |
|
Kaltar
|
Publié: 06 Mai 2002, 10:28 |
|
Inscription : 30 Avr 2002, 09:02 Message(s) : 152
|
C'est vrai Cro a propos de la redefinition. Mais avec ta solution, la structure ne serait visible que dans un seul fichier non
--
Kaltar
|
|
| Haut |
|
 |
|
René Rhéaume
|
Publié: 06 Mai 2002, 19:21 |
|
Inscription : 07 Jan 2002, 22:14 Message(s) : 790 Localisation : Extrémité sud-ouest de Lévis
|
|
La «passe» de cro est-elle spécifique à Visual C++ ou est elle valide pour tous les compilateurs qui existent ?
|
|
| Haut |
|
 |
|
Auron
|
Publié: 06 Mai 2002, 22:05 |
|
Inscription : 22 Fév 2002, 20:54 Message(s) : 738 Localisation : Montréal
|
|
1- Pour la définition d'une structure en C il n'est pas nécessaire d'utiliser un typedef, mais c'est plus simple car ensuite tu n'as pas à utiliser struct à chaque fois que tu veux définir une variable de ce type
2- Les ifndef ne sont pas spécifique a VC et ta structure sera visible dans tous les fichier qui inclus le .h
3- D'après moi tu devrais utiliser extern dans le .h et inclure ce .h dans tous les fichier qui ont besoin de cette structure au lieux de mettre extern dans chaque fichier
|
|
| Haut |
|
 |
|
René Rhéaume
|
Publié: 12 Juin 2002, 10:22 |
|
Inscription : 07 Jan 2002, 22:14 Message(s) : 790 Localisation : Extrémité sud-ouest de Lévis
|
Je fais maintenant une biblothèque avec 3 fichiers C et 5 fichiers d'en-tête. La compilation de cette biblothèque se passe sans problème. Dans un programme qui utilisera cette bibliothèque, j'ajoute le chemin des fichiers d'en-tête et de la bibliothèque dans le options appropries de Visual C++ 5, j'ajoute le nom de la biblothèque dans les paramètres de projet et finalement j'ajoute mon #include. À la compilation du programme j'obtiens les erreurs suivantes:
Code : I:\nsbo\nsbodev\C\#Include\nconst.h(30) : error C2370: 'newLine' : redefinition; different storage class I:\nsbo\nsbodev\C\#Include\nconst.h(31) : error C2370: 'nullChar' : redefinition; different storage class I:\nsbo\nsbodev\C\#Include\nconst.h(32) : error C2370: 'spaceChar' : redefinition; different storage class I:\nsbo\nsbodev\C\#Include\nconst.h(33) : error C2370: 'False' : redefinition; different storage class I:\nsbo\nsbodev\C\#Include\nconst.h(34) : error C2370: 'True' : redefinition; different storage class I:\nsbo\nsbodev\C\#Include\nconst.h(30) : error C2370: 'newLine' : redefinition; different storage class I:\nsbo\nsbodev\C\#Include\nconst.h(31) : error C2370: 'nullChar' : redefinition; different storage class I:\nsbo\nsbodev\C\#Include\nconst.h(32) : error C2370: 'spaceChar' : redefinition; different storage class I:\nsbo\nsbodev\C\#Include\nconst.h(33) : error C2370: 'False' : redefinition; different storage class I:\nsbo\nsbodev\C\#Include\nconst.h(34) : error C2370: 'True' : redefinition; different storage class I:\nsbo\nsbodev\C\#Include\nconst.h(30) : error C2370: 'newLine' : redefinition; different storage class I:\nsbo\nsbodev\C\#Include\nconst.h(31) : error C2370: 'nullChar' : redefinition; different storage class I:\nsbo\nsbodev\C\#Include\nconst.h(32) : error C2370: 'spaceChar' : redefinition; different storage class I:\nsbo\nsbodev\C\#Include\nconst.h(33) : error C2370: 'False' : redefinition; different storage class I:\nsbo\nsbodev\C\#Include\nconst.h(34) : error C2370: 'True' : redefinition; different storage class
Quelle est la cause du problème ?
|
|
| Haut |
|
 |
|
Auron
|
Publié: 12 Juin 2002, 18:13 |
|
Inscription : 22 Fév 2002, 20:54 Message(s) : 738 Localisation : Montréal
|
|
c koi au juste ces variables des define? si oui assure-toi que tu as mis tes #ifndef , #define #endif dans ton .h
|
|
| Haut |
|
 |
|
René Rhéaume
|
Publié: 12 Juin 2002, 20:17 |
|
Inscription : 07 Jan 2002, 22:14 Message(s) : 790 Localisation : Extrémité sud-ouest de Lévis
|
|
Non, ce sont des constantes déclarées avec le mot-clé const. Je réserve #define pour la compilation conditionnelle.
|
|
| Haut |
|
 |
|
Auron
|
Publié: 12 Juin 2002, 20:50 |
|
Inscription : 22 Fév 2002, 20:54 Message(s) : 738 Localisation : Montréal
|
ouin ben je pense que ça marchera pas ton affaire, tu ne pourras pas les mettre dans ton .h en C en leur donnant une valeur, en C++ ben tu ne pourras pas les mettre dans le .h sans mettre de valeur. Voici en gros l'extrait qui me fait penser ça dans MSDN:
Citer: In C, constant values default to external linkage, so they can appear only in source files. In C++, constant values default to internal linkage, which allows them to appear in header files.
|
|
| Haut |
|
 |
|
Thunder
|
Publié: 12 Juin 2002, 21:05 |
|
 |
| Régulier |
 |
Inscription : 06 Jan 2002, 22:42 Message(s) : 416 Localisation : Québec
|
Allô !
Juste pour ta culture personnelle j'ai remarqué un piège ici,
Citer: Code : struct NoyauElement { char nom[25 + 1]; unsigned char etat; unsigned char type; unsigned long valeur; unsigned char fanions; /* bit 0: suivant présent, bit 1: contenu présent */ } ;
Ici tu alloues un buffer de 25 caractères pour le nom, pense de faire des vérifications avant de copier les noms dans cette structure là... Étant donné que l'espace que tu as de disponible est seulement de 25 caractères et du \x0 qui est ton 26e caractère.
Sinon tu vas avoir une possibilité de défoncer ton espace de ta structure... Et là tout peut arriver, les personnes qui cherchent les stacks overflow vont t'aimer... Car ils vont êtres capables de faire des dénis de services.
C'est simplement pour te donner une bonne habitude en passant.
Bebye !
_________________ Thunder
The two basic principles of Windows administration: - For minor problems, reboot - For major problems, reinstall
|
|
| Haut |
|
 |
|
René Rhéaume
|
Publié: 13 Juin 2002, 06:32 |
|
Inscription : 07 Jan 2002, 22:14 Message(s) : 790 Localisation : Extrémité sud-ouest de Lévis
|
Thunder a écrit: Ici tu alloues un buffer de 25 caractères pour le nom, pense de faire des vérifications avant de copier les noms dans cette structure là... Étant donné que l'espace que tu as de disponible est seulement de 25 caractères et du \x0 qui est ton 26e caractère.
Sinon tu vas avoir une possibilité de défoncer ton espace de ta structure... Et là tout peut arriver, les personnes qui cherchent les stacks overflow vont t'aimer... Car ils vont êtres capables de faire des dénis de services.
J'étais déjà au courant d'un débordement éventuel. Je m'étais fait une fonctions gets avec une limite quant au nombre de caractères du tampon.
|
|
| Haut |
|
 |
|
René Rhéaume
|
Publié: 13 Juin 2002, 07:02 |
|
Inscription : 07 Jan 2002, 22:14 Message(s) : 790 Localisation : Extrémité sud-ouest de Lévis
|
Auron a écrit: ouin ben je pense que ça marchera pas ton affaire, tu ne pourras pas les mettre dans ton .h en C en leur donnant une valeur, en C++ ben tu ne pourras pas les mettre dans le .h sans mettre de valeur. Voici en gros l'extrait qui me fait penser ça dans MSDN: Citer: In C, constant values default to external linkage, so they can appear only in source files. In C++, constant values default to internal linkage, which allows them to appear in header files. Pas sûr que ce soit ça. J'ai réussi à faire ce que tente de refaire avec une bibliothèque beaucoup plus petite, c'est-à-dire utiliser const dans le code source et le fichier d'en-tête de la biblothèque et extern const dans le code source qui utilise la bibliothèque.
EDIT : si j'enlève la directive #include "nconst.h" à chacun des fichiers de ma bibliothèque, je recompile celle-ci et je mets en commentaire mes extern const dans le code source du programme utilisant la biblothèque (ça ne change rien qu'elles soient en commentaire ou non), je me retrouve avec des «unresolved external» éditant les liens de mon programme utilisant la biblothèque:
Code : nextlibc.lib(nextio.obj) : error LNK2001: unresolved external symbol "char const newLine" (?newLine@@3DB) nextlibc.lib(nextio.obj) : error LNK2001: unresolved external symbol "char const nullChar" (?nullChar@@3DB) nextlibc.lib(nstring.obj) : error LNK2001: unresolved external symbol "char const nullChar" (?nullChar@@3DB) nextlibc.lib(nstring.obj) : error LNK2001: unresolved external symbol "char const spaceChar" (?spaceChar@@3DB)
|
|
| Haut |
|
 |
Qui est en ligne ? |
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 invité(s) |
|
Vous ne pouvez pas publier de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum
|
|
|
|