Pointer in Struct

Gast #1874313
Lesenswert?

Hallo habe folgendes Problem.Ich habe verschiedene Structs in denen ich 
Daten ablege. Auf die einzelnen Structs möchte ich mit Hilfe von 
Pointern zugreifen welche in einem weiteren Struct sind.Leider kann ich 
nicht auf die einzelnen Werte zugreifen.Irgend wo scheine ich etwas zu 
vergessen. hier ein kleines Beispiel:
1
Header
2
struct  ERROR_BITS { 
3
     int Error1;
4
     int Error2;  
5
     int Error3    
6
};
7

8
union ERROR_REG {
9
   int          all;
10
   struct ERROR_BITS  bit;
11
};
12

13
struct DATA
14
{
15
  struct RS232Data *pWriteData;
16
     union ERRORS_REG *pError;
17
    
18
};
19

20
//Der Stuct ist Global so definiert
21
struct DATA G_Data;
22

23
main
24
{
25
 
26
  G_Data.pError->bit.Error1 = 1; 
27
 //Jetzt versuche ich einen Wert zu setzten leider geht das nicht
28
}
#1874439
Lesenswert?

Anfänger schrieb:

>
1
>  G_Data.pError->bit.Error1 = 1; 
2
> //Jetzt versuche ich einen Wert zu setzten leider geht das nicht
3
>}
4
>

Was heißt in diesem Zusammenhang "es geht nicht"

Kriegst du eine Fehlermeldung vom Compiler?
Wie lautet die Fehlermeldung?
Der Compiler gibt die ja nicht zum Spass aus, sondern damit man sie 
liest und so einen Hinweis bekommt, was falsch sein könnte.
#1874446
Lesenswert?

Anfänger schrieb:
> Er setzt mir den Wert einfach nicht.

In deinem Programm wundert mich das nicht wirklich. Du machst ja auch 
nichts mit dem Wert, warum sollte der Compiler daher den Wert setzen.

-> zeig dein richtiges Programm. Wenn das zu groß ist, dann speck es ab, 
bis nur noch der Fehler übrig bleibt (kontrollieren!) und poste das. 
Aber erfinde keine Beispiele hier fürs Forum. Nimm dein richtiges 
Programm.

In dem was du gepostet hast, ist erst mal nichts falsch. Dein Fehler 
liegt also ganz woanders (vergessenes volatile)
Gast #1874494
Lesenswert?

Die aufgabe welche mir mein Lehrer gestellt hat ist als ertes das 
entwerfen von mehrern Structs (Fehlermeldung, Rs232, Messwerte).Die 
einzelnen Structs sollen aus einem gemeinsammen Struct angesprochen 
werden in welchem nur Pointer enthalten sein sollen.Mit hilfe diesen 
Globalen Struct und den enthaltenen Pointern soll innerhalb des 
Programms auf die einzelnen Structs zugegriffen werden.
#1874504
Lesenswert?

Der Aufbau, denn du machen willst sieht so aus (wenn ich mal 
interpretiere, wie die Einzelteile zusammenhängen sollen)
1
  G_Data
2
  +--------------------+
3
  | DATA               |
4
  +====================+                       +-----------------+
5
  | pWriteData:   o--------------------------->| RS232Data       |
6
  | pError:       o--------------+             +=================+
7
  +--------------------+         |             |                 |
8
                                 |             |   irgendwelche  |
9
                                 |             |      Daten      |
10
                                 v             +-----------------+
11
                           +------------------+
12
                           | ERROR_REG        |
13
                           +==================+
14
                           | all:             |
15
                           | bit:             |
16
                           |    +-----------+ |
17
                           |    | ERROR_BITS| |
18
                           |    +===========+ |
19
                           |    | Error1:   | |
20
                           |    | Error2:   | |
21
                           |    | Error3:   | |
22
                           |    +-----------+ |
23
                           +------------------+

Das ist das Ziel.

Mittels
1
struct DATA G_Data;

hast du den Teil hier erzeugt:
1
  G_Data
2
  +--------------------+
3
  | DATA               |
4
  +====================+
5
  | pWriteData:        |
6
  | pError:            |
7
  +--------------------+

und wo ist der Rest? Wo kommen die anderen Rechtecke (=Variablen von 
einem bestimmten Typ) her, so dass du die Pointer in G_Data darauf 
zeigen lassen kannst? Mit deiner G_Data Variablen hast du sie nicht 
erzeugt. Das erzeugt nur ein struct DATA Objekt und nicht mehr. Steht ja 
auch so im Source Code.
#1874528
Lesenswert?

Anfänger schrieb:
> bekommen. Aber aller Anfang ist schwer.Ja genau so soll das Grundgerüst
> aussehen.

Na, dann programmier das doch!

Du brauchst das struct DATA Objekt. Hier ist es
1
struct DATA G_Data;

1
  G_Data
2
  +--------------------+
3
  | DATA               |
4
  +====================+                       
5
  | pWriteData:   
6
  | pError:       
7
  +--------------------+

weiters brauchst du laut Zeichnung ein union ERROR_REG Objekt. Hier ist 
es
1
union ERROR_REG G_Errors;

1
  G_Data
2
  +--------------------+
3
  | DATA               |
4
  +====================+
5
  | pWriteData:   
6
  | pError:
7
  +--------------------+
8
                        
9

10
                            G_Errors
11
                           +------------------+
12
                           | ERROR_REG        |
13
                           +==================+
14
                           | all:             |
15
                           | bit:             |
16
                           |    +-----------+ |
17
                           |    | ERROR_BITS| |
18
                           |    +===========+ |
19
                           |    | Error1:   | |
20
                           |    | Error2:   | |
21
                           |    | Error3:   | |
22
                           |    +-----------+ |
23
                           +------------------+

damit stehen erst mal die Rechtecke (das RS232 Objekt ignoriere ich mal)

und dann muss man noch dafür sorgen, dass der Pointer in G_Data auf das 
G_Errors Objekt zeigt. Das kann man in der Initialisierung von G_Data 
machen, mann kann es aber auch ganz am Programmanfang machen:
1
int main
2
{
3
  G_Data.pError = &G_Errors;

und schon hat man den Pfeil vom G_Data Objekt zum G_Errors Objekt 
eingerichtet.
1
  G_Data
2
  +--------------------+
3
  | DATA               |
4
  +====================+
5
  | pWriteData:   
6
  | pError:       o--------+
7
  +--------------------+   |
8
                           |
9
                           |
10
                           |  G_Errors
11
                           |  +------------------+
12
                           |  | ERROR_REG        |
13
                           |  +==================+
14
                           +->| all:             |
15
                              | bit:             |
16
                              |    +-----------+ |
17
                              |    | ERROR_BITS| |
18
                              |    +===========+ |
19
                              |    | Error1:   | |
20
                              |    | Error2:   | |
21
                              |    | Error3:   | |
22
                              |    +-----------+ |
23
                              +------------------+


1
struct DATA G_Data;
2
union ERROR_REG G_Errors;
3

4
int main
5
{
6
  G_Data.pError = &G_Errors;
7

8
  // jetzt kannst du über den Pointer in G_Data auf das dadurch verlinkte
9
  // Error Objekt zugreifen
10

11
  G_Data.pError->bits.Error1 = 1;
12
}

Wenn du dir nicht sicher bist, dann zeichne deine Datenstruktur auf 
einem Stück Papier mit, so wie ich das hier gemacht habe! Dann kannst du 
nichts vergessen. Und Doku ist es ausserdem gleichzeitig auch noch.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren