Forum: Compiler & IDEs Struct zeiger an funktion übergeben und später auswerten.


von Carsten (Gast)


Lesenswert?

Servus, habe problem mit Zeiger Übergabe. Wenn ich in Avr Studio 
simuliere
wird der out_sensor in giveSensorConfigTest richtig gesetzt. Aber in 
main verliere ich wieder die Adresse.
1
typedef struct
2
{
3
    uint8_t is_changed;
4
} ConfigSensor;
5
6
volatile ConfigSensor AllSensorsConig[3];
7
8
uint8_t giveSensorConfigTest(uint8_t index, ConfigSensor *out_sensor)
9
{
10
  out_sensor = &AllSensorsConig[index];
11
}
12
13
main()
14
{
15
ConfigSensor *sens;
16
giveSensorConfigTest(2,*sens);
17
(*sens).is_changed = 0;
18
}

von Peter (Gast)


Lesenswert?

habe jetzt nicht getestet aber so müsst es gehen. du braucht ein Zeiger 
auf ein Zeiger.
1
typedef struct
2
{
3
    uint8_t is_changed;
4
} ConfigSensor;
5
6
volatile ConfigSensor AllSensorsConig[3];
7
8
uint8_t giveSensorConfigTest(uint8_t index, ConfigSensor **out_sensor)
9
{
10
  *out_sensor = &AllSensorsConig[index];
11
}
12
13
main()
14
{
15
ConfigSensor *sens;
16
giveSensorConfigTest(2,*sens);
17
(*sens).is_changed = 0;
18
}

von Hrm (Gast)


Lesenswert?

Zeiger auf Zeiger ist richtig, aber der Quelltext muss dann so lauten:
1
typedef struct
2
{
3
    uint8_t is_changed;
4
} ConfigSensor;
5
6
volatile ConfigSensor AllSensorsConig[3];
7
8
uint8_t giveSensorConfigTest(uint8_t index, ConfigSensor **out_sensor)
9
{
10
  *out_sensor = &AllSensorsConig[index];
11
}
12
13
main()
14
{
15
ConfigSensor *sens;
16
giveSensorConfigTest(2, &sens);
17
(*sens).is_changed = 0;
18
}

Also Adressoperator & in Aufruf von giveSensor....

von Carsten (Gast)


Lesenswert?

Habe in Avr Studio simuliert, klappt nicht:( Hilfe!!!

von Carsten (Gast)


Lesenswert?

Jap das geht. Ich werde versuchen es erstmal selber zu verstehen wenns 
net klappt melde ich mich wieder.

Big big thx

von Carsten (Gast)


Lesenswert?

Ich verstehe nicht warum ich ein Zeiger auf einen Zeiger übergeben muss.
Ich übergebe doch ein Zeiger der soll doch einfach auf die Adresse  des 
Elements zeige.

von Peter (Gast)


Lesenswert?

du will mit der funktion ein zeiger auf eine Stucktur zurückbekommen. 
Wenn man etwas zurückbekommen will muss man es als Zeiger übergeben. 
Schlussfolgerung Zeiger auf Zeiger.

von Rolf Magnus (Gast)


Lesenswert?

> (*sens).is_changed = 0;

Das könnte man auch einfacher schreiben:

sens->is_changed = 0;

> uint8_t giveSensorConfigTest(uint8_t index, ConfigSensor
> *out_sensor)
> {
>  out_sensor = &AllSensorsConig[index];
> }

out_sensor ist ein Parameter. Die sind in C im Prinzip lokale Variablen, 
die halt von außen initialisiert werden. out_sensor ist also eine lokale 
Kopie des an die Funktion übergebenen Zeigers. Nach Beenden der Funktion 
ist out_sensor weg und damit ist deine Zuweisung wirkungslos. Wenn deine 
Funktion etwas per Parameter übergebenes ändern soll, mußt du einen 
Zeiger darauf übergeben. in giveSensorConfigTest willst du aber nicht 
ein Objekt vom Typ ConfigSensor ändern, sondern eins vom Typ 'Zeiger auf 
ConfigSensor', also mußt du einen Zeiger auf 'Zeiger auf ConfigSensor' 
übergeben.

von Carsten (Gast)


Lesenswert?

Vielen Dank Leute. Jetzt sind auch die Kopfschmerzen vorerst weg:)

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.