Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1127 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[C] Commande du préprocesseur #define et fichiers headers !

n°210604
juju-le-ba​rbare
Posté le 08-09-2002 à 13:26:39  profilanswer
 

Reprise du message précédent :

legreg a écrit a écrit :

 

Code :
  1. #ifndef _fille1_h
  2. #define
  3. /*Déclarations des fonctions de fille1.c*/
  4. #endif


 
Mais tu defines quoi??




 
Et bien je définit les prototypes des fonctions qui se trouvent dans fille1.c
C'est bien ça qu'il faut faire non ?


---------------
Du temps à perdre ? -> http://www.juju-le-barbare.fr.fm
mood
Publicité
Posté le 08-09-2002 à 13:26:39  profilanswer
 

n°210637
LeGreg
Posté le 08-09-2002 à 14:37:14  profilanswer
 

non je te parle de ta commande #define
qui ne definit rien:
remplace #define
par #define _fille1_h
 
LeGreg

n°210646
juju-le-ba​rbare
Posté le 08-09-2002 à 14:54:28  profilanswer
 

legreg a écrit a écrit :

non je te parle de ta commande #define
qui ne definit rien:
remplace #define
par #define _fille1_h
 
LeGreg




 
salut,
 
oooops oui c'est une grossière erreur d'inattention excuse moi LeGreg :)
Mais sinon c'est quel(s) fichier(s) que je dois compiler pour la librairie ?
Chaque .c (base.c et fille1.c, fille2.c, etc...) ?
Bon ya de l'orage, je me déconnecte ;)
 
@++


---------------
Du temps à perdre ? -> http://www.juju-le-barbare.fr.fm
n°210827
Musaran
Cerveaulté
Posté le 09-09-2002 à 03:46:30  profilanswer
 

Jar Jar a écrit a écrit :

Pour ma part, je pensais au fait qu'ia32 ne gère pas tout seul le code indépendant de la position, et qu'il y a donc un surcoût à chaque appel de fonction à l'intérieur de la bibliothèque, car il faut calculer l'endroit où sauter à chaque fois.



Voilà une de mes grandes interrogations:
Si le code n'est pas chargé toujours à la même adresse, comment gère-t'on les sauts au niveau processeur ?
Il me semble que l'architecture Intel dispose de registres d'adresses de base et d'automatismes pour décaler les adresses.
Mais c'est comme le mécanisme de mémoire virtuel: Ça a forcémment un coût à l'exécution.
 
 

gilou a écrit a écrit :

Tu cherches un utilitaire nommé proto


legreg a écrit a écrit :

Mais je suppose que tu savais deja tout ca ??


Voui.
J'aimerais un moyen portable d'éviter ce préhistorisme.


Message édité par Musaran le 09-09-2002 à 03:49:38

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°210828
Musaran
Cerveaulté
Posté le 09-09-2002 à 03:52:38  profilanswer
 

juju-le-barbare a écrit a écrit :

J'ai mis les fichiers base.c, base.h, filles.c , filles.h, dans le dossier /home/coder/libr/include/


Les sources ne devraient pas aller dans un répertoire d'includes.
 

Citation :

De même quelle est l'utilité des .h, ne pourrai-je pas tout mettre dans les .c, sans déclaration ?

A ce que les utilisateurs externes à la compilation connaissent les noms et formes de ce qui s'y trouve.
A partager les informations communes.
Si tu mets tout dans le .c, un autre source devrait faire les déclarations pour pouvoir faire les appels.
Alors autant les écrires une seule fois dans un header et les patgager.
 
 
J'aurais plutôt mis:
fille1.c:

Code :
  1. #include "fille1.h"


fille1.h:

Code :
  1. #ifndef _fille1_h
  2. "define _fille1_h
  3. #include "base.h"
  4. /*Déclarations des fonctions de fille1.c*/
  5. #endif

 
utilisateur.c ou .h

Code :
  1. #include "fille1.h"


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°210862
juju-le-ba​rbare
Posté le 09-09-2002 à 10:10:35  profilanswer
 

Masuran,
 
Salut,
 
Merci :hello:
 
Déjà je précise il s'agit de c++ et non de C. Je crois pas que ça change grand chose (mais je
me trompe peut-être). base.cpp contient la classe de base, les fichiers filleN.cpp les classes filles.
J'ai fait exactement comme tu viens de dire, mais j'ai malgré tout des erreurs de redéfinition,
je vais t'expliquer.
Je veux créer une librairie dynamique, voilà le script que j'exécute :
 

Code :
  1. echo "Création de la librairie en cours ..."
  2. echo ""
  3. g++ -c -fPIC base.cpp -o base.o
  4. g++ -c -fPIC fille1.cpp -o fille1.o
  5. g++ -c -fPIC fille2.cpp -o fille2.o
  6. g++ -c -fPIC fille3.cpp -o fille3.o
  7. g++ -c -fPIC fille4.cpp -o fille4.o
  8. g++ -o libtoto.so.1.0 -shared -Wl,-soname,libtoto.so *.o -lc && echo "" && echo "Librairie correctement réalisée"


 
Sachant que :
* Chaque filleN.h contient plus ou moins :

Code :
  1. #ifndef _filleN_h
  2. #define _filleN_h
  3. #include "base.h"
  4. /*Déclarations des fonctions de filleN.c*/
  5. #endif


* Le fichier base.h contient juste les include standard (stdio.h, ...)
 
*Chaque fichier filleN.cpp contient #include "filleN.h"
*Le fichier base.cpp contient #include "base.h"
 
 
Jusque là pas de problème, ma librairie est créée :)
 
PROBLEME 1 :
------------
fille2.cpp contient des fonctions qui appellent celles de fille1.cpp
Mais si, dans fille2.h, je fais #include "fille1.h" (voir fille1.cpp, ça change rien) en plus du
#include "base.h", j'ai des erreurs de redéfinitions de fonctions de base.cpp
 
PROBLEME 2 :
------------
Dans le même dossier, j'ai l'applications principale "main.cpp" qui contient tous les
#include des fichiers filleN.h, j'ai aussi les même problèmes de redéfinitions que
précédemment, au niveau de fille2.h cette fois-ci.
Si j'enlève fille2.h, c'est au niveau de fille3.h, et ainsi de suite.
Autrement dit il inclus fille1.h, mais pas les suivants (à cause des redéfinitions) !
 
PROBLEME 3 :
------------
Si en bidouillant beaucoup (mais c'est pas viable) je n'ai plus d'erreurs, et que j'arrive
à créer la librairie, c'est super.
Dans le dossier j'ai un fichier libtoto.so.1.0
Mais je ne sais pas du tout quoi en faire pour l'utiliser. Je créé un lien dans /usr/lib
vers ce fichier, mais ensuite comment l'utiliser ?
Utiliser -ltoto dans les arguments de g++ ?
 
Merci à vous


---------------
Du temps à perdre ? -> http://www.juju-le-barbare.fr.fm
n°210924
Jar Jar
Intaigriste
Posté le 09-09-2002 à 13:28:51  profilanswer
 

Musaran a écrit a écrit :

Voilà une de mes grandes interrogations:
Si le code n'est pas chargé toujours à la même adresse, comment gère-t'on les sauts au niveau processeur ?


Ils sont gérés par des sauts donnés en adresses relatives, la plupart des architectures gèrent ça directement.
Mais le problème avec les PC, c'est, si j'ai bien compris, qu'ils ne gèrent pas lesdites adresses relatives, il faut donc calculer l'adresse à chaque saut avec une addition. C'est là le gros inconvénient des bibliothèques dynamiques...


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
n°210930
Jar Jar
Intaigriste
Posté le 09-09-2002 à 13:37:52  profilanswer
 

juju-le-barbare a écrit a écrit :

PROBLEME 1 :
------------
fille2.cpp contient des fonctions qui appellent celles de fille1.cpp
Mais si, dans fille2.h, je fais #include "fille1.h" (voir fille1.cpp, ça change rien) en plus du
#include "base.h", j'ai des erreurs de redéfinitions de fonctions de base.cpp


Reprenons : il ne faut jamais jamais jamais inclure de fichiers de code avec les #include, ni dans les .c(pp), ni dans les .h.
 
S'il y a des erreurs quand tu inclus 2 fois le même fichier, c'est que tes #ifnedf _MACHIN_H ne sont pas bien faits.
 

Citation :

PROBLEME 2 :
------------
Dans le même dossier, j'ai l'applications principale "main.cpp" qui contient tous les
#include des fichiers filleN.h, j'ai aussi les même problèmes de redéfinitions que
précédemment, au niveau de fille2.h cette fois-ci.
Si j'enlève fille2.h, c'est au niveau de fille3.h, et ainsi de suite.
Autrement dit il inclus fille1.h, mais pas les suivants (à cause des redéfinitions) !


Tu as du t'emmêler les pinceaux quelque part. De toute façon, si base.h appelle tous les autres .h, tu n'as plus besoin de les inclure nulle part.
 

Citation :

PROBLEME 3 :
------------
Si en bidouillant beaucoup (mais c'est pas viable) je n'ai plus d'erreurs, et que j'arrive
à créer la librairie, c'est super.
Dans le dossier j'ai un fichier libtoto.so.1.0
Mais je ne sais pas du tout quoi en faire pour l'utiliser. Je créé un lien dans /usr/lib
vers ce fichier, mais ensuite comment l'utiliser ?
Utiliser -ltoto dans les arguments de g++ ?


Un premier truc, dans la génération de ta bibliothèque, c'est -Wl,-soname,libtoto.so.1 qu'il faut mettre, pas -Wl,-soname,libtoto.so
 
Ensuite, il faut copier le ou les .h que tu vas utiliser dans ton programme vers /usr/local/include (on ne touche PAS à /usr, juste à /usr/local !).
Puis tu mets le libtoto.so.1.0 dans /usr/local/lib, avec des liens en chaîne : libtoto.so -> libtoto.so.1 -> libtoto.so.1.0
Pour compiler, c'est -ltoto.
 
Explication des liens : quand on compile avec -ltoto, il va chercher libtoto.so, qui est un lien vers la version courante. Au lancement du programme, il va chercher le SONAME donné par l'option de compilation de ta bibliothèque (-Wl,-soname,...), donc il faut que ce SONAME soit libtoto.so.1, car si jamais tu fais des changements incompatibles dans ta bibliothèque, tu l'appelleras libtoto.so.2. Ainsi les nouveaux logiciels l'utilisant seront compilés avec le plus récent grâce au lien libtoto.so mais les anciens logiciels compilés avec la première version continueront de marcher.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
n°211446
Musaran
Cerveaulté
Posté le 10-09-2002 à 05:32:22  profilanswer
 

As-tu protégé base.h ?
d'après les symptômes, je ne pense pas.
 
Un header doit être protégé s'il va être inclus plisieurs fois dans une même compilation, y compris indirectement:

Code :
  1. fille2.h->base.h
  2.         ->fille1.h->base.h

En pratique, on les protèges toujours.
 
Si c'est pas ça, c'est qu'il y a une élément illégitime dans tes headers, voir ma 'white-list' plus haut.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°211731
LeGreg
Posté le 10-09-2002 à 17:15:35  profilanswer
 

Citation :

Voui.  
J'aimerais un moyen portable d'éviter ce préhistorisme.


 
le probleme d'inclusion des headers est effectivement lié au C, pour avoir quelque chose de moins archaique, je te suggere de changer de langage. java est cool de ce point de vue la, delphi l'est aussi mais un peu moins (a cause du compilateur qui n'agit qu'en une seule passe..)
 
Je crois que dans certaines boites on arrive a faire un seul gros fichier .cpp par librairie avec un outil spécial qui preprocesse les fichiers du projet. (ca peut accelerer la compilation aussi). Par contre ca represente quelques concessions au niveau du code.
 
LeGreg

mood
Publicité
Posté le 10-09-2002 à 17:15:35  profilanswer
 

n°211925
Musaran
Cerveaulté
Posté le 11-09-2002 à 03:53:43  profilanswer
 

Tant pis, je préfères encore rester au C++.
 
A mon sens une bonne compilation devrait se faire en 4 étapes:
1a) Compilation texte->langage.
1b) Optimisation au niveau langage.
2a) Compilation langage->instructions machine.
2b) Optimisation au niveau machine.
 
2a/2b pouvant être fait au dernier moment, par la machine devant éxécuter le programme.
 
Par contre, une compilation devrait être monolithique.
Je veux dire que le passage inutile par des morceaux objet intermédiare gêne certaines optimisations.
 
En ce sens, je comprends qu'on puisse tricher et faire des #include de sources bien conçus pour simuler un seul gros source.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°212234
LeGreg
Posté le 11-09-2002 à 15:11:25  profilanswer
 

Citation :

Tant pis, je préfères encore rester au C++.
 
A mon sens une bonne compilation devrait se faire en 4 étapes:
1a) Compilation texte->langage.
1b) Optimisation au niveau langage.
2a) Compilation langage->instructions machine.
2b) Optimisation au niveau machine.
 
2a/2b pouvant être fait au dernier moment, par la machine devant éxécuter le programme.


 
ce que tu decris c'est ce qui sous-tend je crois la conception des langages compilés modernes (java jitte, CSharp), avec en plus le souci de la portabilité.  
 

Citation :

Par contre, une compilation devrait être monolithique.
Je veux dire que le passage inutile par des morceaux objet intermédiare gêne certaines optimisations.


 
La compilation monolithique ca marche effectivement bien avec le principe d'executables monolithiques, livrables tels quels. Par contre c'est clair qu'on se traine les objets du C par souci de compatibilité, alors qu'on aurait la possibilité de faire mieux sans doute (comme souvent en informatique).
 
LeGreg

n°212583
Musaran
Cerveaulté
Posté le 12-09-2002 à 03:22:47  profilanswer
 

On pense aux mêmes choses visiblement.
 
Vu que C et C++ sont très orientés performance, je suis étonné qu'on traîne encore de tels boulets.
 
Juju, as-tu résolu ton problème ?


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°213427
juju-le-ba​rbare
Posté le 13-09-2002 à 00:06:34  profilanswer
 

Musaran a écrit a écrit :

On pense aux mêmes choses visiblement.
 
Vu que C et C++ sont très orientés performance, je suis étonné qu'on traîne encore de tels boulets.
 
Juju, as-tu résolu ton problème ?




 
ce que vous m'avez dit m'a pas mal aidé, mais je n'ai pas résolu à 100 % (encore un problème).
Enfin un mini bidouillage et ça marche (sans être optimisé au mieux).
 
Mais le problème vient de moi, je n'ai pas assez étudié le C, je sais je suis fautif :(
enfin bon, je me suis trop intéressé au C++ sans apprendre A FOND le C (ça se voit d'ailleurs), mais je vais réparer cette erreur.
 
Merci, @++


---------------
Du temps à perdre ? -> http://www.juju-le-barbare.fr.fm
n°213467
Musaran
Cerveaulté
Posté le 13-09-2002 à 05:50:34  profilanswer
 

Faut pas aller trop A FOND en C.
 
Souvent le C++ donne de bonnes alternatives.
 
Bon, pour les #include, y'a rien de mieux  :( .


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°214687
juju-le-ba​rbare
Posté le 15-09-2002 à 10:30:55  profilanswer
 

Musaran a écrit a écrit :

Faut pas aller trop A FOND en C.
 
Souvent le C++ donne de bonnes alternatives.
 
Bon, pour les #include, y'a rien de mieux  :( .




 
Oui bien sûr, mais l'un n'empêche pas l'autre :)
Je préferais avoir de meilleurs bases en C...
 
Merci, et au w-e prochain !
 


---------------
Du temps à perdre ? -> http://www.juju-le-barbare.fr.fm
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Probleme d'upload de fichiers avec PHP[PHP] [Nb] Fonction noms de fichiers d'un dossier > variable ?
[php] - commande system et execCommande DNS en php
upload de fichiers avec espacesComment ca marche les Fichiers "WAV" ??
[POP3] Commande pour récupérer l'émetteur d'un messageEquivalent de la commande Shell vb en Delphi
recherche des informations sur la structure physique des fichiers TIFs[Shell-Batch][NT] commande équivalente à 'sleep'
Plus de sujets relatifs à : [C] Commande du préprocesseur #define et fichiers headers !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR