- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 9 von 9

Thema: C-Programm strukturieren/aufteilen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.04.2006
    Ort
    Bayern
    Alter
    34
    Beiträge
    182

    C-Programm strukturieren/aufteilen

    Anzeige

    E-Bike
    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



    -

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    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.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.04.2006
    Ort
    Bayern
    Alter
    34
    Beiträge
    182
    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

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    ... nicht vergessen, die neue routine.c auch in das makefile aufzunehmen!

    Gruß Dirk

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Header- und Sourcefile sollten auf jeden Fall gleich heißen (bis auf die Erweiterung natürlich).
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.04.2006
    Ort
    Bayern
    Alter
    34
    Beiträge
    182
    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

  7. #7
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    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:
    Code:
    #ifndef HEADERDATEINAME_H
    #define HEADERDATEINAME_H
    
    ... //hier steht der Dateiinhalt
    
    #endif
    Das sollte helfen.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  8. #8
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    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.
    MfG
    Stefan

  9. #9
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    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.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test