Nous sommes actuellement le 29 Juin 2026, 03:36

Le fuseau horaire est UTC-5 heures [Heure d’été]




Publier un nouveau sujet Répondre au sujet  [ 18 message(s) ]  Aller vers la page 1, 2  Suivant
Auteur Message
 Sujet du message: Compilation séparée [C]
MessagePublié: 05 Mai 2002, 15:18 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 05 Mai 2002, 15:25 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 05 Mai 2002, 15:44 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 06 Mai 2002, 08:53 
Hors-ligne
Occasionnel
Occasionnel
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 06 Mai 2002, 09:39 
Hors-ligne
Toujours là!
Toujours là!
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 06 Mai 2002, 10:28 
Hors-ligne
Occasionnel
Occasionnel
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 06 Mai 2002, 19:21 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 06 Mai 2002, 22:05 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
MessagePublié: 12 Juin 2002, 10:22 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 12 Juin 2002, 18:13 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 12 Juin 2002, 20:17 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 12 Juin 2002, 20:50 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
MessagePublié: 12 Juin 2002, 21:05 
Hors-ligne
Régulier
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
 Profil  
Répondre en citant  
MessagePublié: 13 Juin 2002, 06:32 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 13 Juin 2002, 07:02 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 18 message(s) ]  Aller vers la page 1, 2  Suivant

Le fuseau horaire est UTC-5 heures [Heure d’été]


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 0 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

Recherche de:
Aller vers :  
Propulsé par phpBB® Forum Software © phpBB Group
Traduction et support en françaisHébergement de site