PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variable über mehere C-Dateien



Kaiser-F
09.09.2005, 12:49
Hallo.

Ich habe ein kleines Problemchen an dem Ich gerade henge,

Ich habe zwei Strukturen:


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....

Psiyou
09.09.2005, 13:12
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.

Kaiser-F
09.09.2005, 13:36
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 ).

Psiyou
09.09.2005, 13:52
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.

SprinterSB
09.09.2005, 14:19
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:



#include "h-file"
// Definition
zeug_t zeug;
...
{
zeug_t *pzeug = &zeug;
zeug.a = ...
pzeug->a = ...
foo (pzeug);
foo (&zeug);
}


h-file:


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.

Kaiser-F
10.09.2005, 13:46
Hallo und Sankeschön für eure Tipps,

Hab eine Kombination aus beiden Antworten:

Und indirekt aud meinem Buch:


h-File:


extern struct paket {
uint8_t sender;
uint8_t befehl;
uint8_t rtr;
uint8_t dlc;
uint8_t daten[8];
};


c-File


#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 ](*,)

bluebrother
12.09.2005, 10:54
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.

SprinterSB
12.09.2005, 11:00
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.