Guten Tag,
in einer C Anwendung gibt es in einer C und H Datei eine Struktur.
Nun soll auch in einer anderen C und H Datei diese Struktur benutzt
werden.
Im folgenden wird gezeigt was ich genau meine:
Wenn du schon header schreibst, kannst du die auch mal irgendwo
includieren. Sonst wäre die ja ziemlich nutzlos.
Die Deklaration
1
ListpList;
gehört in eine .c-Datei, in den header dazu kommt denn
1
externListpList;
Dazu sind deine Variablennamen pList, ptr, etc. sprechend, entsprechen
aber nicht dem, was drin ist. Wenn das Pointer sein sollen, solltest du
dir die Sache mit den Pointern nochmals anschauen.
Oliver
tesla schrieb:> Das ist ja nur ein Beispiel um mein Problem klar zu machen.
Du hast das Problem noch gar nicht beschrieben. Kommt da noch was, außer
unvollständiger Fragmente?
Ok.
In einer anderen C Datei habe habe ich eine weitere Funktion allerdings
möchte ich der Funktion einen Paramter übergeben mit der Referenz von
der Struktur.
Diese Struktur liegt wird in einer ander C und H Datei deklariert und
definiert.
Korrektur. Hab zu schnell geschrieben.
In einer anderen C Datei habe ich eine weitere Funktion, allerdings
möchte ich der Funktion einen Paramter übergeben mit der Referenz von
der Struktur.
Diese Struktur liegt in einer andern C und H Datei die dort deklariert
und
definiert wird.
Deine Beschreibungen sind recht wirr! Schreib doch mal Codefragmente so
in den Post, das man daraus schlau werden kann.
Falls ich dein Geschreibsel richtig deute, willst du eine Struktur in
verschiedenen C-Dateien nutzen. Dann schreibt man die Deklaration in
eine separate Headset-Datei, die in alle C-Dateien includiert wird, die
sie benötigen. Aber ohne den Code von dir ist das nur geraten.
Ich bräuchte quasi einen Fahrplan (kleines Beispiel) wie man in einer
anderen C und H Datei auf eine Struktur zugreifen kann die wo anderes
deklariert und definiert wird. Der Zugriff wird dann in einer Funktion
als Paramter benötigt.
Die Typdeklaration der Struktur muss für alle Programmteile sichtbar
sein, die etwas mit der Struktur anfangen sollen.
Um auf Dein Anfangsfragment zurückzukommen:
test.h enthält diese Typdeklaration, allerdings auch eine Definition
einer Instanz der Struktur -- die hat da nichts verloren (streiche also
die letzte Zeile aus test.h).
test.h musst Du nun überall einbinden, wo der Strukturtyp verwendet
werden soll, also dort, wo Variablen dieses Typs angelegt werden sollen
oder dort, wo Funktionen Strukturen dieses Typs oder Pointer darauf
als Argumente übergeben bekommen.
Solltest Du mit globalen Variablen arbeiten wollen (wovon praktisch
immer abzuraten ist), muss die Zeile, die in test.h nichts verloren hat,
in geänderter Form dort wieder eingefügt werden -- nämlich mit dem
Schlüsselwort "extern" davor.
In genau einer Quelltextdatei (*.c, NICHT! *.h) wiederum gehört diese
Zeile ohne Schlüsselwort "extern" 'rein. Das ist dann die eine globale
Instanz Deiner Struktur.
Wenn dein C-Buch nichts dazu schreibt, wirf es weg, wo weit du kannst.
Wenn du noch kein C-Buch hast, brauchst du eins.
Da die Frage aber hier regelmäßig immer wieder kommt, gibt es dazu was
in den Artikeln:
https://www.mikrocontroller.net/articles/Funktionen_auslagern_(C)
Oliver
@DerEgon: test.h enthält diese Typdeklaration, allerdings auch eine
Definition
einer Instanz der Struktur -- die hat da nichts verloren (streiche also
die letzte Zeile aus test.h).
test.h musst Du nun überall einbinden, wo der Strukturtyp verwendet
werden soll, also dort, wo Variablen dieses Typs angelegt werden sollen
oder dort, wo Funktionen Strukturen dieses Typs oder Pointer darauf
als Argumente übergeben bekommen.
>> du meinst list.h und nicht test.h
Die Zeile 9 ist dort falsch.
Eine Variablendefinition hat in einer .h Datei nichts zu suchen.
Die Definition sollte hier in main.c sein.
Wenn man aber doch mal global darauf zugreifen muss, geht das u.A. mit
Hilfe einer Deklaration
tesla schrieb:>>> du meinst list.h und nicht test.h
Ich würde vorschlagen, dass du erst mal versuchst, deine wirren Gedanken
etwas zu sortieren. In deinem ersten Posting hast du es selbst test.h
genannt…
Die Lösung wurde dir inzwischen dreimal genannt. Warum ignorierst du
sie?
MaWin schrieb:> tesla schrieb:>> Referenz>> In C gibt es keine Referenzen.
Doch, natürlich. Sie heißen nur nicht explizit so.
Mein Gott, eine "Referenz" ist letztlich auch nix anderes als ein
Zeiger. Nur mit einem Haufen Syntax-Zucker etwas diesbezüglich
eingeschränkt, worauf er zeigen darf.
Auf Maschinen-Ebene ist es aber eben einfach nur eine Adresse im
Speicher. Leck' mich.
c-hater schrieb:>> In C gibt es keine Referenzen.> Doch, natürlich. Sie heißen nur nicht explizit so.
Bist du überhaupt in der Lage einem Gesprächsverlauf zu folgen?
Anscheinend nicht.
tesla schrieb:> Ich bräuchte quasi einen Fahrplan (kleines Beispiel) wie man in einer> anderen C und H Datei auf eine Struktur zugreifen kann
Eigentlich ganz einfach:
In eine C-Datei kommt alles, was Speicherplatz kostet. Also sowohl
Instruktionen als auch Variablen.
In eine H-Datei kommen Verweise auf all die Dinge in der zugehörigen C
Datei, die man woanders benutzen will/soll.
Typdeklarationen, die man in mehreren C Dateien benutzen will, kommen in
eine H Datei. Typdeklarationen sind ja nur Angaben für den Compiler, sie
kosten also keinerlei Speicherplatz.
Nochwas:
"typedef" ist keine Typdefinition, was der Name zwar nahelegt, aber das
ist ireführend. Mit typedef kann man zu existierenden Typen einen
zweiten Namen vereinbaren.
Prinzip: typedef alterName neuerName;
Ein Struct definiert man erstmal so:
struct Ottokar
{ einTyp EinMember;
nocheinTyp Nocheiner;
... usw.
}
W.S.
W.S. schrieb:> Nochwas:> "typedef" ist keine Typdefinition, was der Name zwar nahelegt, aber das> ist ireführend. Mit typedef kann man zu existierenden Typen einen> zweiten Namen vereinbaren.
Nein. Das kann so sein, muss aber nicht so sein.
typedef uint16_t color_t;
Z.B. ist ganz klar ein Fall eines reinen Typ-Alias.
Merkt man daran, dass halt mit Variablen vom Typ color_t all dass
möglich ist, was auch mit uint16_t möglich ist (was seinerseits übrigens
auch wieder nur ein Alias für unsigned short ist). Z.B. auch
gegenseitige Zuweisungskompatibilität.
Aber bei typedefs für structs oder unions ist das aber eben nicht immer
so. Da wird ggf. tatsächlich ein neuer Typ generiert. Ob das der Fall
ist, hängt vom Inhalt ab.
Ja klar, C ist eben vollkommen schwachsinnig spezifiziert und deshalb
die hassenswerteste existierende Sprache mit einiger Bedeutung.
c-hater schrieb:> W.S. schrieb:>>> Nochwas:>> "typedef" ist keine Typdefinition, was der Name zwar nahelegt, aber das>> ist ireführend. Mit typedef kann man zu existierenden Typen einen>> zweiten Namen vereinbaren.>> Nein. Das kann so sein, muss aber nicht so sein.
Er hat schon recht. Es ist so.
> typedef uint16_t color_t;>> Z.B. ist ganz klar ein Fall eines reinen Typ-Alias.>> Merkt man daran, dass halt mit Variablen vom Typ color_t all dass> möglich ist, was auch mit uint16_t möglich ist (was seinerseits übrigens> auch wieder nur ein Alias für unsigned short ist). Z.B. auch> gegenseitige Zuweisungskompatibilität.
Es ist nicht nur ein 100% kompatibler Typ, sondern wirklich ein und der
selbe.
> Aber bei typedefs für structs oder unions ist das aber eben nicht immer> so. Da wird ggf. tatsächlich ein neuer Typ generiert.
Nicht vom typedef. Man kann ein typedef mit einer struct-Definition
verbinden, dann ist aber immer noch die struct-Definition das, was den
neuen Typ erzeugt, und das typedef nur noch das, was diesem Typ dann
einen zweiten Namen gibt.