Forum: Compiler & IDEs Problem mit zwei Strukturen


von Uwe (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
habe folgendes Problem mit Strukturen.

Habe zwei Strukturen angelegt mit je zwei einträgen.
Danach je einer Variablen, eine Struktur zugeordnet.

Im Programm dann Struktur1 Werte zu gewiesen und dann selbe mit 
Struktur2.
Wenn ich mir nun die Werte in den Strukturen ansehe, kann ich sehen, das 
immer in beiden Strukturen die selben Werte stehen. Die Strukturen 
werden im Register auf den selben Speicherbereich abgebildet und nicht 
an verschiedenen Speicherbereichen im RAM.
Hat da einer eine Lösung wo das Problem liegt?

Danke
Uwe

von Guru (Gast)


Lesenswert?

Du schreibst zwar, das a und b Zeiger auf jeweils eine der Strukturen 
sind, weist aber diesen Zeigern nichts zu. Also stehen sie auf ihrem 
initialisierungswert, der hier mal 0 ist. Beide zeigen also auf die 
Adresse 0.

Dann ist klar, das die Zuweisungen an die Mitglieder von b die 
vorherigen Zuweisungen an a überschreiben.

von Karl H. (kbuchegg)


Lesenswert?

Uwe schrieb:

> Danach je einer Variablen, eine Struktur zugeordnet.

Nö, hast du nicht.
Du hast nur POinter Variablen angelegt. So ein Pointer kann auf einen 
Speicherbereich zeigen, in dem sich so eine Struktur befindet. Er KANN. 
Aber dazu musst du erst mal so eine Struktur im Speicher haben. Die hast 
du aber nicht.

Ein Zettel auf dem steht "Das Buch ist im Bücherregal, Abschnitt A, 3. 
Buch von links" ist nicht dasselbe wie das Buch selber. Der Zettel ist 
der Pointer. In ihm ist vermerkt, wo das Buch zu finden ist. Aber er IST 
nicht selber das Buch.

von Uwe (Gast)


Lesenswert?

Erst mal danke für die Antwort.
Ja das ist war. Es darf kein Zeiger sein.

Sollte dann so aussehen damit fester Speicherbereich zugeordnet wird.

struct struct1  a;
struct struct1  b;

Aber wie muß die Syntax oder ein Zeiger aussehen, damit ich auf
die Strukturelemente mit den Einträgen zu greifen kann.
Wollte die Strukturen in ein Header-File packen und dieses dann im 
ganzen Programm nutzen können. Die Struktureinträge wollte ich dann über 
die Namen in der Struktur ansprechen.
z.B. Struktur1...->a1 = 0x4 u.s.w.

von Karl H. (kbuchegg)


Lesenswert?

Uwe schrieb:
> Erst mal danke für die Antwort.
> Ja das ist war. Es darf kein Zeiger sein.
>
> Sollte dann so aussehen damit fester Speicherbereich zugeordnet wird.
>
> struct struct1  a;
> struct struct1  b;
>
> Aber wie muß die Syntax oder ein Zeiger aussehen, damit ich auf
> die Strukturelemente mit den Einträgen zu greifen kann.


Zunächst mal brauchst du da erst mal keinen Zeiger.

a ist dein struct1 Objekt.
Also ist a.a1  der erste Member dieses Objektes.

Wenn du einen Pointer hättest

struct struct1 * PointerZuStruct1;

PointerZuStruct1 = &a;

jetzt zeigt der Pointer auf a und damit auf das Strukturobjekt.


   PointerZuStruct1
   +---------+
   |   o-------------------+
   +---------+             |      a
                           |      +------------+
                           +----->| a1:   5    |
                                  +------------+
                                  | a2:   7    |
                                  +------------+

Der Zugriff würde dann so aussehen

   (*PointerZuStruct1).a1

also im Grunde wieder genau gleich. Du nimmst den Pointer

    PointerZuStruct1

dereferenzierst ihn (du verfolgst also im Bild den Pfeil)

   *PointerZuStruct1

was dich zum eigentlichen struct Objekt bringt (dem Kasten, über dem a 
steht)
(Beachte: Jetzt bist du wieder beim Objekt selber, also der Struktur)

und von dieser Struktur wieder der a1 Member

   (*PointerZuStruct1).a1

Aber: Da die Schreibweise mit dem * und der Klammerung ziemlich 
tippaufwändig ist, und man diese Zugriffsform oft braucht, hat man in C 
dafür eine Abkürzung erfunden

    PointerZuStruct1 -> a1

macht genau dasselbe, ist aber einfacher zu tippen. Insbesondere, wenn 
in der Struktur dann selber wieder ein Pointer sitzt, der zu einer 
anderen Struktur führt, etc. etc.

> Wollte die Strukturen in ein Header-File packen und dieses dann im
> ganzen Programm nutzen können.

Ja kannst du auch.
Funktioniert genau gleich, wie mit allen anderen globalen Variablen. 
Dazu braucht es aber erst mal keine Pointer.

Vielleicht doch mal ein C-Buch konsultieren?

von Guru (Gast)


Lesenswert?

>Aber wie muß die Syntax oder ein Zeiger aussehen, damit ich auf
>die Strukturelemente mit den Einträgen zu greifen kann.

Nun, mit dem Operator "->" geht das durchaus, wenn Du einen Zeiger 
benutzt.
Die andere Alternative ist der Operator ".", wenn Du keinen Zeiger 
benutzt.

>Wollte die Strukturen in ein Header-File packen und dieses dann im
>ganzen Programm nutzen können. Die Struktureinträge wollte ich dann über
>die Namen in der Struktur ansprechen.

Das eine hat mit dem anderen gar nichts zu tun.

Was für Header-Dateien und dem Unterschied von Deklaration und 
Definition zusammenhängt gilt für Variablen aller Typen. Auch aber nicht 
nur für Variablen die ein struct als Typ haben.

In einer Header-Datei wird höchstens ein "extern"-Verweis auf eine 
Variable eingetragen. Die eigentliche Definition erfolgt in einer der 
C-Dateien.

von Guru (Gast)


Lesenswert?

Verd... Ist der wieder schnell heute abend. :-)

von eugler (Gast)


Lesenswert?

Guru schrieb:
> Verd... Ist der wieder schnell heute abend. :-)

Und dermaßen kompetent und geduldig. Respekt an der Stelle!

von Uwe (Gast)


Lesenswert?

Hallo!

Habe es mal den verschiedenen Zugriffsformen getestet.

Läuft! Danke

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.