Hallo zusammen, ich benutze ein Entwicklungsboard von Glyn mit einem Controller aus der M16C-Familie. Es wird der Tasking Manager (TM) mit NC30 als Compiler und KD30 als Debugger benutzt. Folgendes Problem: Ich habe ein größeres Projekt und möchte meine main.c aufsplitten, da sie zu groß wird. Z.B. möchte ich eine functions.c anlegen in der meine Funktionen ausgelagert werden. Ferner habe ich mehrer Header-Dateien wie z.B. die SFR62.h oder die selbstangelegte Globals.h. Ich lege mir also eine funtions.c an, kopiere die Funktionen rein und speichere sie. Dann füge ich sie im Projekt Editor ein. So weit so gut, wenn ich nun compiliere gibt es in dieser Datei eine Fehlermeldung, da ich meine Headerdateien in dieser nicht includiert habe. (In main.c habe ich sie includiert.) Includiere ich sie ebenfalls in functions.c kommt es wiederum zu einer Fehlermeldung: "multiple defiened...". An dieser Stelle weiß ich nicht mehr weiter, da es sich um einen (kleinen) Teufelskreis handelt... Normalerweise versucht man diese Mehrfachincludierungen doch mit diesem Gerüst in den Headerdateien abzufangen?!: #ifndef GLOBALS #define GLOBALS . . . #endif Scheint aber nicht zu functionieren... In diesem Zusammenhang eine Frage zum Projekt Editor: An welcher Stelle muß ich meine funtions.c einfügen? Direkt unter main.c oder in den übergeordneten Ordner? Und muß ich dann in den functions.c-Ordner alle gebrauchten Headers einfügen? Habe schon einige Zeit daran rumgespielt, bin aber zu keinem Ergebnis gekommen. Wäre nett wenn jemand von euch mir weiterhelfen kann... Danke!
Weiß denn wirklich niemand einen Lösung, ich bin hier echt am verzweifeln. Da geht wieder der ganze Vormittag drauf weil man an einem kleinen Softwareproblem nicht weiterkommt....
Dein Problem besteht wohl eher darin das du mal C lernen solltest. Du kannst selbstverstaendlich deinen Source aufteilen. Diese Teile muessen dann natuerlich einzeln uebersetzt werden und werden vom linker zusammengefuegt. Und selbstverstaendlich kannst du vollkommen problemlos deine Headerdateien in jeder der Sourcedateien einlesen. Lediglich wenn du eine globale Variable in dem eigenen Headerfile des ausgelagerten Source erzeugst solltest du mit Include dafuer sorgen das sie in den anderen Files als "extern" declariert wird. Ausserdem solltest du den Funktionskopf der externen Funktionen nochmal in der Headerdatei deklarieren damit du sie von deinem Hauptprogramm aufrufen kannst. Olaf
@Simon: Warum benutzt du die TM Entwicklungsumgebung? Es gibt von Renesas die HEW4 Entwicklungsumgebung welche wesentlich besser und aktueller ist!
ok, ich dachte zwar ich könnte C programmieren.... aber ich werde es mal probieren, danke. TM benutzen wir weil unser "Auftraggeber" es uns vorgeschlagen hat. Fande es aber seid dem ersten Tag eher bescheiden. Werde jetzt mal HEW ausprobieren. Runterladen kann ich aber nur HEW3.1, auch ok?
Die HEW3.1 ist auch ok. Bei der HEW4 ist die aktuelle Version des NC30 Compilers schon eingebunden.
Hier der Link für den NC30 und HEW4: http://eu.renesas.com/fmwk.jsp?cnt=quicklink_updates_product_child.htm&fp=/products/tools/coding_tools/c_compilers_assemblers/m3t_nc30wa/child_folder/&title=QuickLink%20Updates
@Olaf: Ich glaube ich habe noch nicht ganz verstanden wie du es meinst. Ich möchte einen eigenen Header nur für globale Variablen anlegen. Diesen Header möchte ich dann in main.c und functions.c aufrufen. Wie genau deklariere ich den Header als extern? In main.c z.B. #include extern "globals.h"?? Danke.
Definiere in deiner main.c ein #define WHERE In deiner Header-Datei schreibst du dann: #ifdef WHERE define EXT #ifelse #define EXT extern #endif EXT int variable;
Danke, das hat mir schon weitergeholfen, aber so richtig klappen tut dat noch nicht. Ich schreibe dir es noch mal ganz ganz ausführlich ;) globals.h: #ifdef WHERE #define EXT #else //ifelse gibt es nicht?! #define EXT extern #endif EXT int variable; //Was macht diese Zeile //globale Variablen: unsigned long cnts; . . . main.c: #define WHERE //so korrekt? #include "math.h" #include "sfr62.h" #include "globals.h" //das soll meine Headerdatei sein void main (void) { . . } function.c: //globale Variablen werden auch hier benutz #define WHERE #include "sfr62.h" #include "globals.h" void init (void) { . . . Ich hoffe du hast dies verstanden und kannst mir genau sagen wo meine Fehler sind. Ich sags mal so: Im Studium haben wir wenig mit globalen Variablen gearbeitet, deshalb kenne ich mich nicht so aus. Kennst du Quellen wo dieses Problem explizit behandelt wird?
Dein Problem ist da du nicht weisst was die die Defines machen und was extern bedeutet. Mach den define in funktion.h weg und schreibe vor jede globale Variable ein EXT. Olaf
Deshalb habe ich dich ja auch nach Quellen gefragt, würde gerade erfahren was die defines und extern wirklich bedeutet.
Hi wenn du globale Variablen nutzen willst dann geh folgendermaßen vor: globals.c
1 | int globFoo = 0815; |
2 | int globBar = 666; |
globals.h
1 | #ifndef GLOBALS_H_INCLUDED
|
2 | #define GLOBALS_H_INCLUDED
|
3 | extern int globFoo; |
4 | extern globBar; |
5 | #endif
|
modul1.c
1 | #include "globals.h" |
modul2.c
1 | #include "globals.h" |
usw. Du mußt dann nur dafür sorgen das dein Buildtool alle C-Dateien kompiliert und zu einem Binary zusammenlinkt. Matthias
Hi bei globBar fehlt natürlich noch der Datentyp. Matthias
Hey Super, werde ich auf jeden Fall noch ausprobieren!!!
Leider funzt es immer noch nicht so richtig. Habe alles genauso befolgt wie du es beschrieben hast. Compiliert (NC30) wird auch alles richtig, beim linken (LN30) gibt es dann Probleme. Ich schreib mal die Meldungen: now processing pass 1 processing ".\ncrt0.r30" processing ".\MAIN.r30" . . processing ".\globals.r30" processing "Libraries" ! ERROR(ln30): .\MAIN.r30 : '_NachschwingerZaehler' is multiple defined . . . . Hast du noch eine Idee dazu?
Hi Keine Ahnung was da jetzt noch Probleme macht. Ohne den Code zu sehen kann ich nichts dazu sagen. Matthias
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.