Struct zeiger an funktion übergeben und später auswerten.

Gast #1331200
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
}
Gast #1331202
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
}
Gast #1331208
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....
Gast #1331372
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.

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