Forum: Compiler & IDEs Pointer in Struct


von Anfänger (Gast)


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
}

von Karl H. (kbuchegg)


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.

von Anfänger (Gast)


Lesenswert?

Er setzt mir den Wert einfach nicht.

von Karl H. (kbuchegg)


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)

von NurEinGast (Gast)


Lesenswert?

Syntaktisch hat das "Programm" vielleicht kein Fehler, aber pError zeigt 
doch noch in's Nirwana ? Oder ?

von Anfänger (Gast)


Lesenswert?

Ok und wie lege ich fest wohin pError zeigt? Hey sorry für die Fragen 
bin halt neuling und versuche ein Projekt für die Schule zum laufen zu 
bringen.

von Peter (Gast)


Lesenswert?

Anfänger schrieb:
> Ok und wie lege ich fest wohin pError zeigt? Hey sorry für die Fragen
> bin halt neuling und versuche ein Projekt für die Schule zum laufen zu
> bringen.

die Frage warum es überhaupt pointer sind?

Erzählt doch mal etwas genau was du vor hast.

von Karl H. (kbuchegg)


Lesenswert?

Anfänger schrieb:
> Ok und wie lege ich fest wohin pError zeigt?

Indem du ein ERROR_REG Objekt anlegst und pError darauf zeigen lässt.

Nur daduch, dass du ein struct DATA Objekt anlegst, hast du ja noch kein 
ERRER_REG Objekt. Der Pointer im struct DATA kann auf so eines zeigen, 
aber dazu muss es erst einmal eines geben.

von Anfänger (Gast)


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.

von Klaus W. (mfgkw)


Lesenswert?

Ich vermisse schon wieder schmerzlich den Button im Forum mit der 
Aufschrift
"Standardantwort: C-Buch lesen, C lernen!"

von Karl H. (kbuchegg)


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.

von Anfänger (Gast)


Lesenswert?

Ich habe ein Buch vor mir und versuche mit dessen Hilfe das hin zu 
bekommen. Aber aller Anfang ist schwer.Ja genau so soll das Grundgerüst 
aussehen.

von Karl H. (kbuchegg)


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.

von Anfänger (Gast)


Lesenswert?

Besten Dank das:

G_Data.pError = &G_Errors;

war es was mir gefehlt hat.Jetzt funktioniert mein Programm.Danke für 
die geistige Anregung.

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.