- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 8 von 8

Thema: Variable über mehere C-Dateien

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795

    Variable über mehere C-Dateien

    Anzeige

    Praxistest und DIY Projekte
    Hallo.

    Ich habe ein kleines Problemchen an dem Ich gerade henge,

    Ich habe zwei Strukturen:

    Code:
    struct paket {
    uint8_t sender;
    uint8_t befehl;
    uint8_t rtr;
    uint8_t dlc;
    uint8_t daten[8];
    } transmit, receive ;

    In meiner main.c rufe ich eine funktion auf, welche mir die Werte in den Strukturen aktualisiert. Diese Funktion befindet sich in einer anderen C-Datei.

    Wie kann ich das realisieren, damit mein Compiler nicht sagt "error, first use in this Function" ?

    In meinem Buch und im Forum kann ich leider nichts finden,

    Globale Variablen machen das auch nicht....
    Gruß,
    Franz

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.04.2005
    Ort
    Hamburg <-> Bremen
    Alter
    43
    Beiträge
    112
    Zwei moeglichkeiten:
    1.:
    Deine Strukturen sind global, und zB in main.c definiert.
    Dann deklarierst Du die Variablen in der anderen Date noch mal, allerdings mit dem einem vorangestellten "extern", das sagt dem compiler dann das der Linker die entsprechende refferenz liefert.

    2.:
    Du uebergibst einen Pointer auf die/das Strukt an die Funktion.

    Hoffe geholfen zu haben.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    Danke Psiyou,

    1.
    an das mit EXTERN hab ich garnichmt mehr gedacht... und setzte es bei funktionen ein ich Aff!

    Am extern lag der Fehler!

    2.
    Das mit dem Pointer ist garkeine schlechte Idee.... wobei es in meinem Fall bei Globalen Variablen eigentlich egal ist.... die werden ja nicht zig mal kopiert, sondern nur in der Funktion aktualisiert ( nicht in die Funktion übertragen ).
    Gruß,
    Franz

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.04.2005
    Ort
    Hamburg <-> Bremen
    Alter
    43
    Beiträge
    112
    Wenn das eh globale sind, und diese auch die ganze laufzeit ueber benoetigt werden ist das mit extern sogar deutlich besser. Sparst das uebergeben der Adresse, und Pointeroperationen brauchen AFAK immer 2 Zyklen.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Wenn du das Ding global machst, bekommst du oft breiteren Code, weil GCC einen direkten Zugriff macht.
    Geschieht der Zugriff hingegen indirekt, werden die schlankeren und genauso schnellen Zugriffe via X, Y, oder Z-Reg benutzt. Allerdings kommt hintzu, daß du den Pointer erst beschaffen must.

    Zu deinem eigentlichen Problem:
    Die Deklaration einer globalen Variablen gehört in einen Header, ihre Definition in einen C-File.

    c-file:

    Code:
    #include "h-file"
    // Definition
    zeug_t zeug;
    ...
    {
       zeug_t *pzeug = &zeug;
       zeug.a = ...
       pzeug->a = ...
       foo (pzeug);
       foo (&zeug);
    }
    h-file:
    Code:
    typedef struct {
    ...
    } zeug_t;
    
    extern void foo (zeug_t*);
    // Deklaration
    extern zeug_t zeug;
    Im obigen Beispiel erzeugt GCC für
    zeug.a = ...
    leider den gleichen Code wie für
    pzeug->a = ...,
    Das zu verhindern und GCC den indirekten Zugriff verwenden zu lassen, ist nicht immer einfach.
    Disclaimer: none. Sue me.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    37
    Beiträge
    795
    Hallo und Sankeschön für eure Tipps,

    Hab eine Kombination aus beiden Antworten:

    Und indirekt aud meinem Buch:


    h-File:
    Code:
    extern struct paket {
    uint8_t sender;
    uint8_t befehl;
    uint8_t rtr;
    uint8_t dlc;
    uint8_t daten[8];
    };

    c-File
    Code:
    #include "das H-File"
    
    struct paket transmit, receive ;

    EDIT--- Scheint aber nicht in einer anderen C zu funktionieren...

    Ich glaube ich werde es dann doch mit einem array machen... wenn das mit der Struktur so mies ist
    Gruß,
    Franz

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2004
    Ort
    Karlsruhe
    Beiträge
    223
    du musst die struct extern machen. also
    extern struch paket transmit, receive;

    in deinem h-file machst du nur die Struktur an sich extern, aber eben nicht die Strukturvariable.

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Du musst transmit und receive auch deklarieren im header (wie oben von mir beschrieben)

    extern struct paket receive;
    extern struct paket transmit;

    Mit einem array müsstest du es genau so machen, da kommst du nicht drum rum.
    Disclaimer: none. Sue me.

Berechtigungen

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

Solar Speicher und Akkus Tests