M16C: Tasking Manager: Projekt mit mehreren .c - Files?!

Gast #231906
Lesenswert?

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!
Gast #231908
Lesenswert?

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
Gast #231910
Lesenswert?

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?
Gast #231913
Lesenswert?

@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.
Gast #231916
Lesenswert?

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?
Persönliche Seite #231920
Lesenswert?

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
Gast #231923
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren