![]() |
|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Ouvrir sur le forum | Recherche | Messages du jour | Marquer les forums comme lus |
Publicité |
![]() |
|
Outils de la discussion | Modes d'affichage |
![]() |
#1 |
Membre confirmé
Date d'inscription: 09/12/2008
Messages: 63
|
![]() Bonjour,
Mon programme commence a etre long et j'aimerais scinder mon programme en plusieurs fichiers mais je n'y arrive pas. a la base, j'ai : Code:
#include <PA9.h>... int guitare(); int main() { guitare(); } guitare() { ... } comment faire ? faut t'il inclure un header dans guitare.c pour redefinir les variables globales? Merci d'avance. Dernière modification par Yodajr ; 10/02/2009 à 02h23. |
![]() |
![]() |
Publicité |
![]() |
#2 |
Membre confirmé
Date d'inscription: 21/10/2007
Messages: 225
|
![]() Un peu long a expliquer, j'ai moi même eu du mal a piger, je m'y suis mis ya pas longtemps, cherches un peu dans les topics de ce mois tu devrais trouver des posts a ce sujet (variables globales etc)
__________________
![]() ![]() NDS LITE - M3 Ds Simply - PaLib |
![]() |
![]() |
![]() |
#3 |
Membre confirmé
Date d'inscription: 19/12/2008
Localisation: Île de France
Messages: 85
![]() |
![]() Je t'ai mis des arguments dans tes fonctions pour que tu voie ce que ça fait.
guitare.h Code PHP:
Code PHP:
Code PHP:
![]()
__________________
Glyca “Le chemin le plus court d'un point à un autre est la ligne droite, à condition que les deux points soient bien en face l'un de l'autre.„ Matos : NDSL|R4|EZ-Flash 3in1(new)|µSD 1 et 2 Go Ordi : Vista|Ubuntu|Debian Dernière modification par Dr.Vince ; 16/01/2009 à 17h39. |
![]() |
![]() |
![]() |
#4 |
Administrateur
|
![]() la même chose mais avec quelques petites modifcations:
Code PHP:
Code PHP:
Code PHP:
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner] Projet en cours: [Ne plus abandonner de projet...] |
![]() |
![]() |
![]() |
#5 |
Membre confirmé
|
![]() ha bah dis donc, faudrait que je fasse également ça de mon côté
![]() parce que 7000 lignes dans un seul fichier c'est pas gérable du tout et la compilation prend 3 plombes pour un caractère de plus ou de moins ![]() |
![]() |
![]() |
![]() |
#6 |
Administrateur
Date d'inscription: 09/11/2005
Messages: 3 750
|
![]() Hummm je fait probablement mal, mais j'ai jamais utilisé vos ifndef...
J'ai un gros header.h avec toutes mes déclarations de variables, pointeurs, structures, tableaux, etc dedans (vince m'a dit que c'était pas bien, mais bon, pour de petits projets amateurs, ça suffit pas ?), du genre : header.h Code PHP:
le main.c Code PHP:
le guitare.c Code PHP:
Et pour chaque nouveau fichier .c que je crée, suffit de mettre en haut : #include "header.h" et ça roule...
__________________
![]() ![]() ![]() ![]() ![]() ![]() Votez pour établir la liste des meilleurs homebrews DS ! ![]() Vous voulez programmer sur PSP ? Dernière modification par Yodajr ; 16/01/2009 à 21h39. |
![]() |
![]() |
![]() |
#7 |
Membre confirmé
|
![]() bon voilà, j'ai découpé un projet en cours et ça marche du tonnerre
![]() 1300 lignes dans le main.c maintenant réparties dans 11 fichiers .c, ça fait plaisir ![]() et ça fera plaisir au compilo surtout ![]() merci pour ce topic ![]() |
![]() |
![]() |
![]() |
#8 |
Administrateur
|
![]() si yoda, c'est déjà un très bon début de faire comme ça, car au moins ça te permet de découper ton projet en plusieurs fichiers .c
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner] Projet en cours: [Ne plus abandonner de projet...] |
![]() |
![]() |
![]() |
#9 |
Membre confirmé
Date d'inscription: 20/11/2007
Localisation: Maubeuge (59)
Messages: 223
|
![]() Moi je sais que c'est mal, mais je mets tout dans le .h sans créer le .c et ça fonctionne aussi .
exemple : main.c Code:
#include "fonction.h" int main() { guitare(); basse(5); PA_WaitFor(Pad.Newpress.Anykey); return 0; } fonction.h Code:
int guitare() { // code de la fonction } void basse(int valeur) { // code de la fonction } |
![]() |
![]() |
![]() |
#10 |
Membre confirmé
Date d'inscription: 21/10/2007
Messages: 225
|
![]() nan c'est pas mal, permets d'éclaircir le debut du code du main, sinon tu te retrouverais avec 500 lignes avant le main() et ça c'est pas top pour coder...
__________________
![]() ![]() NDS LITE - M3 Ds Simply - PaLib |
![]() |
![]() |
![]() |
#11 |
Administrateur
|
![]() si c'est mal et complètement inutile, à part le fait de pas avoir plusieurs milliers de lignes dans ton main.c
d'ailleurs tu peux appeler ton fichier fonction.c au lieu de fonction.h puisque ça revient à ça en fait, de l'inclusion de code source dans ton main.c
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner] Projet en cours: [Ne plus abandonner de projet...] |
![]() |
![]() |
![]() |
#12 |
Administrateur
Date d'inscription: 09/11/2005
Messages: 3 750
|
![]() De plus, dites moi si je me trompe, mais en faisant comme ça (tes fonctions dans des .h), tu ne gagne rien au niveau temps de compilation, non ?
Car à chaque fois ton compilo se (re)tape tout... |
![]() |
![]() |
![]() |
#13 |
Membre
Date d'inscription: 09/02/2009
Localisation: corse
Messages: 31
|
![]() je relance un peu le sujet car j'ai suivi ce que vous avez dit et sa ne marche pas, et j'ai beau chercher je ne trouve pas.
Donc mes fichiers "main.c", "functions.h" et "functions.c" se trouve dans le même dossier Donc voici le code exacte de chaque page ainsi que l'erreur de compilation Main.c Code:
//include libraries and functions #include <PA9.h> #include "gfx/all_gfx.c" #include "gfx/all_gfx.h" #include "compo_top.h" #include "compo_bottom.h" #include "functions.h" //main function int main(void) { //initialization Palib PA_Init(); PA_InitVBL(); //infinite loop to keep the program activated while(1) { PA_WaitForVBL(); } return 0; } functions.h Code:
#ifndef functions_H #define functions_H //list of functions extern void EcranTitre(void); extern void EcranTitre2(void); extern void Credit(void); #endif Code:
#include "functions.h" //function EcranTitre void EcranTitre(void) { //Fonction ecran titre 1 } void EcranTitre2(void) { //Fonction ecran titre 2 } void Credit(void) { //Fonction cédit } Code:
C:\devkitPro\Projects\Premier>make clean clean ...Premier C:\devkitPro\Projects\Premier>make compo_bottom.gif compo_top.gif functions.c c:/devkitPro/Projects/Premier/source/functions.c: In function 'EcranTitre': c:/devkitPro/Projects/Premier/source/functions.c:8: warning: implicit declaratio n of function 'PA_Init8bitBg' c:/devkitPro/Projects/Premier/source/functions.c:10: warning: implicit declarati on of function 'PA_SetBrightness' c:/devkitPro/Projects/Premier/source/functions.c:12: warning: implicit declarati on of function 'PA_LoadGif' c:/devkitPro/Projects/Premier/source/functions.c:12: error: 'compo_top' undeclar ed (first use in this function) c:/devkitPro/Projects/Premier/source/functions.c:12: error: (Each undeclared ide ntifier is reported only once c:/devkitPro/Projects/Premier/source/functions.c:12: error: for each function it appears in.) c:/devkitPro/Projects/Premier/source/functions.c:13: error: 'compo_bottom' undec lared (first use in this function) c:/devkitPro/Projects/Premier/source/functions.c:14: error: 's8' undeclared (fir st use in this function) c:/devkitPro/Projects/Premier/source/functions.c:14: error: expected ';' before 'i' c:/devkitPro/Projects/Premier/source/functions.c:16: error: 'i' undeclared (firs t use in this function) c:/devkitPro/Projects/Premier/source/functions.c:20: warning: implicit declarati on of function 'PA_WaitForVBL' c:/devkitPro/Projects/Premier/source/functions.c:23: error: 's16' undeclared (fi rst use in this function) c:/devkitPro/Projects/Premier/source/functions.c:23: error: expected ';' before 'time' c:/devkitPro/Projects/Premier/source/functions.c:26: error: 'time' undeclared (f irst use in this function) c:/devkitPro/Projects/Premier/source/functions.c:26: error: 'Pad' undeclared (fi rst use in this function) c:/devkitPro/Projects/Premier/source/functions.c:26: error: 'Stylus' undeclared (first use in this function) c:/devkitPro/Projects/Premier/source/functions.c:39: warning: implicit declarati on of function 'PA_ResetBgSys' c:/devkitPro/Projects/Premier/source/functions.c: In function 'EcranTitre2': c:/devkitPro/Projects/Premier/source/functions.c:50: warning: implicit declarati on of function 'PA_EasyBgLoad' c:/devkitPro/Projects/Premier/source/functions.c:50: error: 'menu' undeclared (f irst use in this function) c:/devkitPro/Projects/Premier/source/functions.c:51: error: 'back' undeclared (f irst use in this function) c:/devkitPro/Projects/Premier/source/functions.c:54: error: 'Pad' undeclared (fi rst use in this function) c:/devkitPro/Projects/Premier/source/functions.c:59: warning: implicit declarati on of function 'PA_WaitFor' c:/devkitPro/Projects/Premier/source/functions.c: In function 'Credit': c:/devkitPro/Projects/Premier/source/functions.c:66: error: 'back' undeclared (f irst use in this function) c:/devkitPro/Projects/Premier/source/functions.c:67: error: 'credit' undeclared (first use in this function) c:/devkitPro/Projects/Premier/source/functions.c:69: error: 'Stylus' undeclared (first use in this function) make[1]: *** [functions.o] Error 1 make: *** [build] Error 2 C:\devkitPro\Projects\Premier>pause Appuyez sur une touche pour continuer... |
![]() |
![]() |
![]() |
#14 |
Administrateur
Date d'inscription: 09/11/2005
Messages: 3 750
|
![]() Quand il essaye de compiler ton functions.c, il ne trouve aucune référence à PAlib, donc il plante
![]() Dans tout le topic, il n'y a pas qu'une seule solution ![]() |
![]() |
![]() |
![]() |
#15 |
Membre
Date d'inscription: 09/02/2009
Localisation: corse
Messages: 31
|
![]() Donc si j'ai bien compris, attention le cerveau c'est mis en route
![]() ![]() Les includes présent dans le fichier main.c doivent donc se trouvé aussi dans functions.c, donc jusque la sa va la compilation démarre et les erreurs cité plus haut on disparu mais d'autres apparaisse Code:
C:\devkitPro\Projects\Premier>make clean clean ...Premier C:\devkitPro\Projects\Premier>make compo_bottom.gif compo_top.gif functions.c main.c arm-eabi-g++ -g -mthumb-interwork -mno-fpu -LC:/devkitPro/palib/lib/lib -Wl -spe cs=ds_arm9.specs compo_bottom.o compo_top.o functions.o main.o -LC:/devkitPro/pa lib/lib/lib -lpa9 -L/c/devkitPro/libnds/lib -lfat -lnds9 -ldswifi9 -o build.elf main.o:(.rodata+0x0): multiple definition of `menu_Info' functions.o:(.rodata+0x0): first defined here main.o:(.rodata+0xc): multiple definition of `menu_Map' functions.o:(.rodata+0xc): first defined here main.o:(.rodata+0x60c): multiple definition of `menu_Tiles' functions.o:(.rodata+0x60c): first defined here main.o:(.rodata+0x4e4c): multiple definition of `back_Info' functions.o:(.rodata+0x4e4c): first defined here main.o:(.rodata+0x4e58): multiple definition of `back_Map' functions.o:(.rodata+0x4e58): first defined here main.o:(.rodata+0x5458): multiple definition of `back_Tiles' functions.o:(.rodata+0x5458): first defined here main.o:(.rodata+0x9e58): multiple definition of `credit_Info' functions.o:(.rodata+0x9e58): first defined here main.o:(.rodata+0x9e64): multiple definition of `credit_Map' functions.o:(.rodata+0x9e64): first defined here main.o:(.rodata+0xa464): multiple definition of `credit_Tiles' functions.o:(.rodata+0xa464): first defined here main.o:(.rodata+0xdde4): multiple definition of `menu_Pal' functions.o:(.rodata+0xdde4): first defined here main.o:(.rodata+0xdeac): multiple definition of `back_Pal' functions.o:(.rodata+0xdeac): first defined here main.o:(.rodata+0xdfec): multiple definition of `credit_Pal' functions.o:(.rodata+0xdfec): first defined here main.o:(.data+0x0): multiple definition of `menu' functions.o:(.data+0x0): first defined here main.o:(.data+0x18): multiple definition of `back' functions.o:(.data+0x18): first defined here main.o:(.data+0x30): multiple definition of `credit' functions.o:(.data+0x30): first defined here collect2: ld returned 1 exit status make[1]: *** [/c/devkitPro/Projects/Premier/Premier.elf] Error 1 make: *** [build] Error 2 |
![]() |
![]() |
![]() |
#16 |
Administrateur
|
![]() tu inclus uniquement les fichiers dont tu as besoin dans chaque fichier, que ce soit dans ton main.c ou dans ton functions.c
par exemple, si tes gfx sont uniquement utilisées dans functions.c bah tu les inclus pas dans ton main.c etc....
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner] Projet en cours: [Ne plus abandonner de projet...] |
![]() |
![]() |
![]() |
#17 |
Administrateur
Date d'inscription: 09/11/2005
Messages: 3 750
|
![]() Fait comme je fait, c'est simple et efficace, crée un header.h avec les déclarations qui te serviront tout le temps (la lib, variables globales, fonctions, etc...) et inclut ce header.h dans tous tes .c
(regarde mon post plus haut) Sinon oui, comme dit vince, tout ce qui est background and co, ça doit être déclaré qu'une fois. PS : ne te préoccupe pas des .o, le makefile de PAlib s'en charge tout seul. |
![]() |
![]() |
![]() |
#18 |
Membre
Date d'inscription: 09/02/2009
Localisation: corse
Messages: 31
|
![]() Je vous remercie, c'est explication m'ont fortement aidé.
bonne soirée |
![]() |
![]() |
![]() |
#19 |
Membre
|
![]() Bonjour à tous,
Je me permet de poser mon problème ici car je pense qu'il dans la même lignée ![]() J'essaye de structurer un peu mon code, je suis passé par la première étape qui est de le séparer en plusieurs fichiers. Maintenant j'aimerai regrouper mes fichiers de classes dans des dossiers différents. Malheureusement quand je fait ça pose problème ![]() Code:
main.o: In function `main': c:/Donnees/toshen/ToshenSubversion/dev_cpp/EclipseProject/ToshenProject/source/main.cpp:16: undefined reference to `GlobalViewController::GlobalViewController()' c:/Donnees/toshen/ToshenSubversion/dev_cpp/EclipseProject/ToshenProject/source/main.cpp:18: undefined reference to `GlobalViewController::launch()' c:/Donnees/toshen/ToshenSubversion/dev_cpp/EclipseProject/ToshenProject/source/main.cpp:21: undefined reference to `GlobalViewController::~GlobalViewController()' c:/Donnees/toshen/ToshenSubversion/dev_cpp/EclipseProject/ToshenProject/source/main.cpp:21: undefined reference to `GlobalViewController::~GlobalViewController()' J'ai cherché un peu partout mais je n'ai pas trouvé (j'ai peut-être mal cherché ![]()
__________________
Silwek ~ Toshen Project ~ |
![]() |
![]() |
![]() |
#20 |
Administrateur
|
![]() tu peux mettre un exemple de code quand tu fais ce include et indiquer l'arborescence des fichiers/répertoire qui va avec ?
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner] Projet en cours: [Ne plus abandonner de projet...] |
![]() |
![]() |
![]() |
#21 |
Membre confirmé
Date d'inscription: 16/11/2008
Localisation: Dreux
Messages: 150
|
![]() (je voulais juste dire une chose: séparer ses fichiers *.h en plusieurs est utile par exemple quand on réutilise des fonctions d'un projet à un autre, un peu à la manière d'une librairie. Aussi, cela permet, pour autant que l'on inclus que les *.h nécessaires à chaque fois, de minimiser les temps de recompilation lorsque l'un des dits *.h est modifié. Les deux usages sont adeptes du "Si ça ne me concerne pas, j'en ai rien à faire"
![]()
__________________
Meow! |
![]() |
![]() |
![]() |
#22 |
Membre
|
![]() Alors voici mon arborescence :
![]() Ma Classe A qui n'est pas dans un répertoire : ClasseA.h Code:
#ifndef CLASSEA_H_ #define CLASSEA_H_ class ClasseA { public: ClasseA(); virtual ~ClasseA(); }; #endif /* CLASSEA_H_ */ Code:
#include "ClasseA.h" ClasseA::ClasseA() { } ClasseA::~ClasseA() { } Ma classe B qui est dans un répertoire : ClasseB.h Code:
#ifndef CLASSEB_H_ #define CLASSEB_H_ class ClasseB { public: ClasseB(); virtual ~ClasseB(); }; #endif /* CLASSEB_H_ */ Code:
#include "ClasseB.h" ClasseB::ClasseB() { } ClasseB::~ClasseB() { } Mon main.cpp : Code:
#include "ClasseA.h" #include "repertoire/ClasseB.h" // Function: main() int main(int argc, char ** argv) { ClasseA instanceA; ClasseB instanceB; return 0; } Si je commente la création de l'instanceB ça compile comme il faut. Au sinon je laisse l'instanciation de ma classe B ça me met ça : Code:
main.o: In function `main': c:/Donnees/Programmation/c/NDS/Test/source/main.cpp:8: undefined reference to `ClasseB::ClasseB()' c:/Donnees/Programmation/c/NDS/Test/source/main.cpp:10: undefined reference to `ClasseB::~ClasseB()' collect2: ld returned 1 exit status J'espère qu'il y a toutes informations qu'il faut. Je précise que mes classes ont été générées automatiquement avec eclipse.
__________________
Silwek ~ Toshen Project ~ |
![]() |
![]() |
![]() |
#23 |
Administrateur
|
![]() avant tout, je vois que tu utilises Eclipse, moi il me fait chier si j'utilise des .h au lieu de .hpp au niveau du mot clé class, tu as ce pb où pas ?
sinon tu as mis toutes les infos c'est nickel, mais à priori le problème se situerait au niveau du makefile, donc si tu t'y connais assez vérifie que tes sous-répertoires sont bien inclus dans la compilation, sinon ajoute les. Si t'y connais rien bah poste le contenu de ton makefile Pour mon projet PSP j'ai modifié mon makefile comme suit, pour éviter d'avoir à ajouter à la main tous les .o car j'en ai vraiment trop ! du coup j'inclus que les sous-répertoires Code:
SOURCES = src src/sousrep1 src/sousrep2 export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) CFILES = $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) CXXFILES = $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) export OBJS = $(CFILES:.c=.o) $(CXXFILES:.cpp=.o)
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner] Projet en cours: [Ne plus abandonner de projet...] |
![]() |
![]() |
![]() |
#24 |
Membre
|
![]() Effectivement en rajoutant mon répertoire dans le Makefile ça marche nickel
![]() Code:
SOURCES := source source/repertoire ![]()
__________________
Silwek ~ Toshen Project ~ |
![]() |
![]() |
![]() |
#25 |
Administrateur
|
![]() bah oui pour chaque sous répertoire mais bon tu dois pas en avoir tant que ça si ??
__________________
Projets Abandonnés: [Arcomage Advance] [Puzznic] [PA Card Games] [Blob Runner] Projet en cours: [Ne plus abandonner de projet...] |
![]() |
![]() |
![]() |
Liens sociaux |
Publicité |
Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s)) | |
Outils de la discussion | |
Modes d'affichage | |
|
|
![]() |
||||
Discussion | Auteur | Forum | Réponses | Dernier message |
![]() |
Le Rodeur | Aide au développement | 9 | 14/12/2008 12h39 |
DS Trimmer - Petit programme que je vous offre :) | Bodom-Child | [NDS] Divers | 41 | 24/07/2008 13h57 |
![]() |
KillerMapper | Archives - Divers (NDS) | 15 | 21/01/2008 22h45 |
![]() |
dd59370 | Linkers M3/R4 | 6 | 25/12/2007 21h43 |
Programme d'aide à la création de DAT | PsyKos | Projets | 3 | 04/10/2007 20h53 |