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

Gast #1331200
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
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
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 #1331223
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.
Gast #1331226
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.
Gast #1331372
> (*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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.