PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C-Programm strukturieren/aufteilen



dreadbrain
06.06.2010, 10:42
Hallo,
ich bin derzeit dabei eine graphische Bedienoberfläche mit einem G-LCD und einem Mega128 zu programmieren.
Jetzt merk ich das das Programm sehr lang und dadurch etwas unübersichtlich wird. (Man muss viel scrollen^^).

Nun hab ich probiert entsprechende Teile des Programms wie z.b. die Steuerfunktionen für die restliche Hardware (DDS) in ein eigenes File auszulagern und das einzubinden, was aber nicht funktionieren will.
Mein erster Ansatz war folgender:
-neues File "routine.c" erstellen
-Funktionen in die Datei kopieren
-im Hauptprogramm #include "routine.c"

Nun bringt er mir Haufenweise Fehlermedlungen (105 Errors)

nachdem ich die Header der verwendeten Funktionen (für Display etc.) in die routine.c eingebunden habe bringt er mir weniger Fehler.

Ich habe die Vermutung das mein Vorgehen einem richtigen Programmierer das Wasser in die Augen treibt, deshalb frage ich euch:
Wie geht man vor, wenn man Programmteile (Funktionen) auslagern muss.
-Für was braucht man den Header?
-Wo definiert man die Funktionsprototypen?
-Wo definiert man die in den Funktionen definierten Variablen?(Kann man auf die dann auch direkt im Hauptprogramm zugreifen, sozusagen Global)
-Was wus man wo einbinden, damit beim Compilieren alles zusammenpasst?

Gibt es evtl. ein Tutorial in dem die Erstellung von eigenen Librarys beschrieben wird, denn im Endefekt wirds ja nix anderes?

Danke für eure Antworten

mfg Benedikt Lippert



-

BurningWave
06.06.2010, 14:20
Normalerweise macht man das so:
Man hat eine DeinProjektname.c in der main() und so weiter definiert sind. Wenn du jetzt Funktionen auslagern willst, erstellt du deine routine.c und noch eine routine.h. In der routine.c definierst du alle Funktionen und in routine.h deklarierst du die Prototypen. Du kannst jetzt (nachdem du alle Dateien zu deinem Projekt hinzugefügt hast) alle Headerdateien (.h) mittels #include in DeinProjektname.c einbinden.

dreadbrain
06.06.2010, 18:20
Hallo,

so hab ich das eigentlich schon gemacht, nur das meine Headerdatei anders geheisen hat als die Datei in der dann die Funktionen ausgelagert sind.

Muss ich nächste Woche mal Testen. Diese Woche werde ich wahrscheinlich nicht dazu kommen. hab nämlich Fachabiturprüfung.

mfg Benedikt

Dirk
06.06.2010, 18:50
... nicht vergessen, die neue routine.c auch in das makefile aufzunehmen!

Gruß Dirk

BurningWave
06.06.2010, 19:02
Header- und Sourcefile sollten auf jeden Fall gleich heißen (bis auf die Erweiterung natürlich).

dreadbrain
08.06.2010, 20:03
Hallo,

Ich hab nun die Routinen in eine extra .c Datei ausgelagert.
Und die Definitionen dafür in eine .h Datei mit gleichen Namen.
Diese .h hab ich in Main-Programm eingebunden.
In der .c hab ich die nötigen anderen Funktionen erneut eingebunden, die in den ensprechenden Routinen gebraucht werden.

Nun bringt er mir folgende Fehlermeldung:
hardware.o:(.data+0x10): multiple definition of `r_stop'
dds_controller.o:(.data+0x70): first defined here

hardware.c ist die Datei in die ich die Routinen ausgelagert habe.
r_stop ist eine Variable, die ich im Hauptprogramm (dds_controller) bereits im Header des Haupprogramms definiert habe.
Diesen Header habe ich nochmal in die hardware.c eingebunden.

Nun meine Frage: Wo muss ich global verwendete Variablen definieren?


mfg Benedikt Lippert

BurningWave
08.06.2010, 20:15
Also die .c Dateien darfst du nicht mittels #include einbinden.
Globale Variablen definierst du da wo sie gebraucht werden, also wenn deine globale Variable überall gebraucht wird dann definierst du sie in der Hauptdatei, wenn sie nur in einer Unit gebraucht werden definierst du sie in der zugehörigen Header-Datei.
Deine Fehlermeldung deutet darauf hin, dass manche Symbole mehrfach definiert wurden. Das kann geschehen, indem du eine Header-Datei mehrfach in ein Projekt einbindest, das kannst du dagegen tun: Verändere die Headerdateien so:


#ifndef HEADERDATEINAME_H
#define HEADERDATEINAME_H

... //hier steht der Dateiinhalt

#endif

Das sollte helfen.

sternst
08.06.2010, 22:00
Als erstes schnappst du dir mal dein C-Buch und schlägst den Unterschied zwischen "Definieren" und "Deklarieren" nach.

Dann: definiert wird eine Variable genau ein mal, und zwar in irgendeiner der C-Dateien (keinesfalls im Header). Deklarieren kannst du sie beliebig oft. Die Deklaration kommt dann in den Header.

BurningWave
09.06.2010, 18:27
Sry ich verwechsel immer definieren und deklarieren. Und ein weiterer Fehler, globale Variablen immer in der .c Datei der Unit definieren, wenn diese Variable in einer anderen Unit gebraucht wird, kannst du sie in der Header der 1. Unit als extern deklarieren.