Forum: PC-Programmierung Zugriff auf eine Struktur


von tesla (Gast)


Lesenswert?

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:
1
test.h
2
typedef struct List
3
{
4
....
5
}List;
6
7
List pList;
1
auto.h
2
void FunctionAuto(List ptr);
1
main.c
2
int main()
3
{
4
  Verwendung der FUnktion "FunctionAuto..."
5
  FunctionAuto(pList);
6
}

von Oliver S. (oliverso)


Lesenswert?

Wenn du schon header schreibst, kannst du die auch mal irgendwo 
includieren. Sonst wäre die ja ziemlich nutzlos.

Die Deklaration
1
List pList;
gehört in eine .c-Datei, in den header dazu kommt denn
1
extern List pList;

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

von tesla (Gast)


Lesenswert?

Das ist ja nur ein Beispiel um mein Problem klar zu machen.

von DerEgon (Gast)


Lesenswert?

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?

von tesla (Gast)


Lesenswert?

Leider kann ich den Code nicht posten. Ist eine menge Holz.

von MaWin (Gast)


Lesenswert?

tesla schrieb:
> Leider kann ich den Code nicht posten

Du sollst auch nicht den Code posten, sondern eine Frage.

von Oliver S. (oliverso)


Lesenswert?

tesla schrieb:
> Ist eine menge Holz.

Bei der Art der Frage lässt das nichts gutes erahnen...

Oliver

von tesla (Gast)


Lesenswert?

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.

von tesla (Gast)


Lesenswert?

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.

von Teo D. (teoderix)


Lesenswert?

Der pflanzt uns doch!?


PS:
Falls doch nicht: In meiner Glaskugel ist ein "->" zu sehen... aber nur 
sehr trübe.

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

tesla schrieb:
> Ok.

Eine Frage endet mit einem Fragezeichen!
Du hast immer noch keine Frage geschrieben.

Was willst du von uns?

von Horst V. (hoschti)


Lesenswert?

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.

: Bearbeitet durch User
Beitrag #7141212 wurde vom Autor gelöscht.
von tesla (Gast)


Lesenswert?

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.

von tesla (Gast)


Lesenswert?

1
// list.h
2
typedef struct List
3
{
4
    Data  data[100];  /* Speicherung der Listeneintraege */
5
    Data* z;      /* Aktuelle Adresse wo sich der Zeiger gerade befindet */
6
    int    entries;    /* Anzahl der Eintraege --> Maximal N_MAX Eintraege sind erlaubt */
7
}List;
8
9
List pList;
10
11
void ListInit(List* pList);
12
void ListInsert(List* pList, uint8_t* msg, uint16_t len);
13
14
15
//test.h
16
void TestFunc(List* pList);
17
18
19
//test.c
20
void TestFunc(List* pList)
21
{
22
 ...
23
}
24
25
//main.c
26
int main()
27
{
28
 pList ==> initialisieren und Werte in Liste speichern
29
 
30
 TestFunc(????);
31
32
}

von K. Bernighan (Gast)


Lesenswert?

>Ich bräuchte quasi einen Fahrplan

Kein Problem:

https://de.wikipedia.org/wiki/The_C_Programming_Language

von DerEgon (Gast)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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

von tesla (Gast)


Lesenswert?

@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

von keine Pointer (Gast)


Lesenswert?

tesla schrieb:
> List pList;
>
> void FunctionAuto(List ptr);

Das sind keine Pointer

von tesla (Gast)


Lesenswert?

Referenz

von Dirk B. (dirkb2)


Lesenswert?

tesla schrieb:
1
// list.h
2
typedef struct List
3
{
4
    Data  data[100];  /* Speicherung der Listeneintraege */
5
    Data* z;      /* Aktuelle Adresse wo sich der Zeiger gerade befindet */
6
    int    entries;    /* Anzahl der Eintraege --> Maximal N_MAX Eintraege sind erlaubt */
7
}List;
8
9
List pList; // FALSCH
10
11
void ListInit(List* pList);
12
void ListInsert(List* pList, uint8_t* msg, uint16_t len);

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
1
 extern List pList;

von MaWin (Gast)


Lesenswert?

tesla schrieb:
> Referenz

In C gibt es keine Referenzen.

von Rolf M. (rmagnus)


Lesenswert?

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?

von c-hater (Gast)


Lesenswert?

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.

von MaWin (Gast)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.
1
typedef struct X  { int i; } Y;
ist nur eine verkürzte Schreibweise von:
1
struct X  { int i; };
2
typedef struct X Y;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.