bonjour
comment creer une bibliotheque de fonctions pesonalisées pour l'appeler dans mon programme principale?
merci.
bonjour
comment creer une bibliotheque de fonctions pesonalisées pour l'appeler dans mon programme principale?
merci.
Bonjour,
C'est un peu vague, du fait que nous ne savons pas quel est le système d'exploitation cible, ni si la bibliothèque est statique ou dynamique, ni quel sont les outils utilisés.
D'une manière générale :
Un fichier *.h (fichier d'en-tête) ne contient pas de code mais seulement les définitions des macros, constantes, structures "publiques" et les déclarations des fonctions et variables globales publiques.
Pour créer une bibliothèque (library) statique ou dynamique, il faut un (ou plusieurs) fichier(s) .c [qui contiennent le code de la bibliothèque] et des fichier(s) d'en-tête(s).
Ensuite on compile et on fait l'édition de lien en spécifiant bien que l'on souhaite créer une bibliothèque et quel est son type (statique ou dynamique).
Dans la plupart des cas, le fichier .h nécessaire au code de la bibliothèque sera inclut directement avec un projet nécessitant la bibliothèque ainsi produite (pas besoin de réécrire un fichier .h pour "s'interfacer" avec la bibliothèque).
J'espère que ca répond en partie à la question, mais plus de précisions seraient bienvenues.
Déjà ton titre "creer sa propre bibliotheque .h" exprime une grande confusion...Envoyé par Amine_sas
http://emmanuel-delahaye.developpez....m#bibliotheque
Une fois la question du vocabulaire reglée, oui, il est possible de fabriquer sa propre bibliothèque de fonctions.
Il y a des principes de conception à respecter (interface / implémentation),
http://emmanuel-delahaye.developpez....ganiser_source
http://emmanuel-delahaye.developpez.....htm#organiser
et des outils qui permettent de fabriquer une bibliothèque.
Les détails de ces outils dépendent de l'implémentation (le bon forum est alors "Outils pour C & C++ / EDI / Compilateurs / etc")
je suis desolé pour "l'ambguité" de mon message.
tt simplement je fait mes premiers pas en C et je souhaite creer un "Header File" et l'inclure dans mon programme principal pour faire appel à d'autres fonctions definies dans un autre programme C.
systeme d'exploitation: Windows XP.
compilateur: Borland C++ 5.5.
Merci
Je t'ai donné des pistes. On attend ton code ...Envoyé par Amine_sas
Le header est en dehors du prog principal.je souhaite creer un "Header File" et l'inclure dans mon programme principal
Dans ce dernier seul figure l'appel au header:
Code : Sélectionner tout - Visualiser dans une fenêtre à part #include <header.h>
Bonjour,
Tu voulais surement écrireEnvoyé par seriousme
?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #include "header.h"
Just passing by
On peut ecrirepour un header se trouvant de le repertoire où on compile si on specifie l'option "-I."
Code : Sélectionner tout - Visualiser dans une fenêtre à part #include <header.h>
Pas portable et pratique douteuse. Il est d'usage que les headers standards et ceux du compilateur (extensions) utilisent les < >. Le " " sont réservés aux headers aopplicatifs.Envoyé par Gruik
Pour les bibliothèques tierces, on trouve les deux pratiques.
Bonjour tout le monde,
Je me permets de continuer sur ce poste afin de ne pas faire de doublon.
Je dois également réaliser un ptit prog où j'aimerais inclure mon propre header . J'ai donc regarder ce que Emmanuel avait écrit et j'ai adapté .
Pourriez vous me dire si cela est bon dans un 1er temps (Je débute également en c)
pile.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #ifndef H_PILE #define H_PILE PILE *creerPile(); OBJ *sommet(PILE *p); bool empiler(OBJ *nouvObj, PILE *p); bool depiler (PILE* p); #endif /* guard */
pile.c
et j'ai donc un autre point c où j'inclus #include "pile.h"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104 /* ----------- pile.c ---------- */ #include <math.h> #include <stdio.h> #include <stdlib.h> #include "pile.h" #define BOOLEEN int #define VRAI 1 #define FAUX 0 #define NEW(x) (x*)malloc(sizeof(x)) /*---------------------------------*/ /* PILE dans structure récursive */ /* Gestion dynamique de la mémoire */ /*------------------------------- */ typedef struct { double valeur; int code; }OBJ; typedef struct cel { OBJ objet; struct cel *lienprec; } CELLULE; typedef struct { CELLULE *haut; } PILE; /*=====================================*/ /* Outils internes (privés) */ /*=====================================*/ /*- TROUVER_PLACE ---------------------*/ static CELLULE * _trouverPlace() { CELLULE *e; e = NEW(CELLULE); return (e); } /*- COPIER_OBJET -----------------------*/ static void _copierObjet(OBJ *nouvObj, CELLULE *e) { memcpy(e, nouvObj, sizeof(OBJ)); } /* - PILE_VIDE----------------------------*/ static BOOLEEN _pileVide(PILE *p) { if (p->haut == NULL) return (VRAI); else return (FAUX); } /*======================================*/ /* Outils de Base */ /*======================================*/ /*- CREER_PILE ------------------------ */ PILE * creerPile() { PILE * p; p = NEW(PILE); if (p == NULL) return (p); p->haut = NULL; return (p); } /* - SOMMET------------------------------*/ OBJ* sommet(PILE *p) { return ((OBJ *)(p->haut)); } /*=====================================*/ /* AJOUT D'UN OBJET */ /*=====================================*/ BOOLEEN empiler(OBJ *nouvObj, PILE* p) { CELLULE *e; e = _trouverPlace(p); if (e == NULL) /* Mémoire saturée */ return (FAUX); else { _copierObjet(nouvObj,e); e->lienprec = p->haut; p->haut = e; return (VRAI); } } /*==========================================*/ /* RETRAIT D'UN OBJET */ /*==========================================*/ BOOLEEN depiler(PILE* p) { CELLULE *e; if (_pileVide(p)) return (FAUX); /* Pile vide */ else { e = p->haut; p->haut = e->lienprec; free(e); /* libérer la place */ return (VRAI); } }
J'ai commencé à dévelloper avec KDevellop et il me jette à la compilation . (Je précise qd même que si je ne créé pas de .h ca marche)
J'ai des messages du genre "'PILE' undeclard first use in this function"
Est ce qu'il faut compiler autrement lorsqu'on intégre un .h?
Merci pour vos réponses
Il faut mettre les déclarations des structures dans le .h...
[EDIT] Vu que tu as un type booléen défini par des macros, il faudra intégrer ces macros dans ton .h
Syndrôme du lundi matin...
[/EDIT]
pile.h
Après, j'ai pris l'habitude de mettre une déclaration des fonctions statiques au début du fichier .c, donc cela devient:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #ifndef H_PILE #define H_PILE #define BOOLEEN int #define VRAI 1 #define FAUX 0 typedef struct { double valeur; int code; }OBJ; typedef struct cel { OBJ objet; struct cel *lienprec; } CELLULE; typedef struct { CELLULE *haut; } PILE; PILE *creerPile(); OBJ *sommet(PILE *p); BOOLEEN empiler(OBJ *nouvObj, PILE *p); BOOLEEN depiler (PILE* p); #endif /* guard */
pile.c
Je n'ai pas regardé le reste du code...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 /*=====================================*/ /* Outils internes (privés) */ /*=====================================*/ static CELLULE * _trouverPlace(); static void _copierObjet(OBJ *nouvObj, CELLULE *e); static BOOLEEN _pileVide(PILE *p) ; /*- TROUVER_PLACE ---------------------*/ CELLULE * _trouverPlace() { CELLULE *e; e = NEW(CELLULE); return (e); } /*- COPIER_OBJET -----------------------*/ void _copierObjet(OBJ *nouvObj, CELLULE *e) { memcpy(e, nouvObj, sizeof(OBJ)); } /* - PILE_VIDE----------------------------*/ BOOLEEN _pileVide(PILE *p) { if (p->haut == NULL) return (VRAI); else return (FAUX); }
Jc
Incohérent.Envoyé par mikedavem
- PILE n'est pas défini.
- OBJ n'est pas défini.
- bool n'est pas défini.
Un header doit être 'autonome'. Il doit contenir/inclure tout ce qu'il lui est nécessaire. Ni plus, ni moins.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 #ifndef H_PILE #define H_PILE /* pile.h */ #define BOOLEEN int #define VRAI 1 #define FAUX 0 typedef struct { double valeur; int code; } OBJ; typedef struct cel { OBJ objet; struct cel *lienprec; } CELLULE; typedef struct { CELLULE *haut; } PILE; PILE *creerPile(void); OBJ *sommet(PILE *p); BOOLEEN empiler(OBJ *nouvObj, PILE *p); BOOLEEN depiler (PILE* p); #endif /* guard */
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 /* ----------- pile.c ---------- */ #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "pile.h" #define NEW(x) (x*)malloc(sizeof(x)) /*=====================================*/ /* Outils internes (privés) */ /*=====================================*/ <...>
Je crois deviner sous quelle influence !Envoyé par fearyourself
- Pour faire simple, les identificateurs commençant par _ sont réservés à l'implémentation
- Il n'est généralement pas nécessaire de définir des prototypes séparés pour les fonctions privées (static)
- Si ça l'était, ce serait pour des raisons qui méritent une explication et des précautions d'usage (référence croisées, récursion intentionelle ou non)
- Il est étrange que les définitions de fonctions n'aient pas le mot clé 'static'. Le compilateur ne dit rien ?
C'est quand même une façon très compliquée d'écrire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 /*=====================================*/ /* Outils internes (privés) */ /*=====================================*/ /*- TROUVER_PLACE ---------------------*/ static CELLULE * trouverPlace() { CELLULE *e = NEW(CELLULE); return e; } /*- COPIER_OBJET -----------------------*/ static void copierObjet(OBJ *nouvObj, CELLULE *e) { memcpy(e, nouvObj, sizeof(OBJ)); } /* - PILE_VIDE----------------------------*/ static BOOLEEN pileVide(PILE *p) { if (p->haut == NULL) return (VRAI); else return (FAUX); }
J'ai toujours pas compris à quoi ça servait ces satanés booléens... Probablement un complot des fabricants de claviers...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 static int pileVide(PILE *p) { return p->haut == NULL; }
Effectivement . Ca marche mieux .
En effet si on ne dit pas à quoi correspond les objets il ne risque pas de trouver ..
Non le compilateur ne me dit rien . Pas un warning ...
--> Rectification : J'ai des warning sur mon prog c qui utilise pile.h
--> incompatible implicite declaration of built-in functiun 'malloc'
--> incompatible implicite declaration of built-in functiun 'pow'
--> incompatible implicite declaration of built-in functiun 'printf'
--> incompatible implicite declaration of built-in functiun 'memcopy'
Mon code:
En théorie il devrait y avoir un problème ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 #include "pile.h" // Fonction EVAL double EVAL(OBJ* expr, int lgr) { PILE *ptr_pile; OBJ *temp; BOOLEEN verif; int i; // Création de la pile ptr_pile = NEW(PILE); if (ptr_pile) { for (i=0;i<lgr;i++) { if (expr[i].code == 0) verif = empiler(&(*(expr+i)),ptr_pile); else { temp = NEW(OBJ); if (temp) { // On stocke la valeur du sommet temp->valeur = sommet(ptr_pile)->valeur; // On dépile verif = depiler(ptr_pile); // On effectue les opérations selon le cas if ((int)expr[i].valeur>=-5 && ((int)expr[i].valeur <=-1)) { switch((int)expr[i].valeur) { case -1 : temp->valeur = (temp->valeur) + (sommet(ptr_pile)->valeur); break; case -2 : temp->valeur = (sommet(ptr_pile)->valeur) - temp->valeur; break; case -3 : temp->valeur = temp->valeur - (sommet(ptr_pile)->valeur); break; case -4 : temp->valeur = (sommet(ptr_pile)->valeur) / (temp->valeur); break; case -5 : temp->valeur = pow((temp->valeur) , (sommet(ptr_pile)->valeur)); break; } // On fixe à 0 le code pour opérande temp->code = 0; // On dépile la 2nd opérande verif = depiler(ptr_pile); // On insère le résultat de l'opération verif = empiler(temp,ptr_pile); } else printf("Valeur erronée pour le champ valeur. Le résultat suivant sera tronqué :\n"); } else printf("Erreur mémoire pour temp\n"); } } } return (sommet(ptr_pile)->valeur); } // Fonction principale int main (int argc , char *argv[]) { // Expression à calculer soit 12. 6. / 1. + 3. 1. - ^ OBJ expression[] = { {12.,0},{6.,0},{-4.,1},{2.,0},{-1.,1},{3.,0},{1.,0},{-2.,1},{-5.,1} }; int nbexp = 9; double resultat; resultat = EVAL(expression,nbexp); printf("%f\n",resultat); }
Merci bcp![]()
Cela m'étonnerait, tu devrais avoir un problème pour la compilation de pile.c en pile.o, c'est tout. Pas pour le ficher lambda.c qui inclue pile.h...Envoyé par mikedavem
--> incompatible implicite declaration of built-in functiun 'malloc'
--> incompatible implicite declaration of built-in functiun 'pow'
--> incompatible implicite declaration of built-in functiun 'printf'
--> incompatible implicite declaration of built-in functiun 'memcopy'
Il te manque des inclusions:
PS: c'est memcpy et pas memcopy
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #include <stdlib.h> //pour malloc #include <stdio.h> //pour printf #include <math.h> //pour pow #include <string.h> //pour memcpy
Jc
Zut, je suis démasqué,Envoyé par Emmanuel Delahaye
Non, mais c'est vrai que je ne compile pas avec autant de warning que toi. J'utilise que -Wall -Wextra... Il faudrait que je vois ce qu'il dit avec tes 23 lignes de warningsIl est étrange que les définitions de fonctions n'aient pas le mot clé 'static'. Le compilateur ne dit rien ?
C'est un complot des langages qui se disent plus jolie parce qu'il y a un true ou un false...J'ai toujours pas compris à quoi ça servait ces satanés booléens... Probablement un complot des fabricants de claviers...
Jc
Ceci implique que NEW() soit défini dans pile.h. Par conséquent, il faut ajouter <stdlib.h> dans pile.h, car NEW() utilise malloc().Envoyé par mikedavem
Je rappelle : le header doit être 'autonome'. Il doit inclure tout ce qui lui est nécessaire. (Ou nécessaire aux fichier qui utilisent ses ressources comme la macro NEW()).
Effectivement en placant tout au bon endroit ca marche bcp mieux . Il n'y a plus de warning.
Merci
Par contre tjrs aucune erreur en compilant chaque fichier à part .
pile.c , pile.h et fichierlamba.c
Depuis quand on compile un fichier .h?Envoyé par mikedavem
Jc
Dsl , rectification
pile.c et fichierlamba.c
Partager