Henrik wrote:
> Wenn ich einen Zeiger zurückgeben möchte, dann kann ich die Variable res
> aber nicht in der Funktion deklarieren, oder? Weil dann ist sie doch nur
> lokal, und somit ist die Adresse, die ich auf dieses struct zurückgeben
> würde, doch außerhalb der Funktion nicht unbedingt gültig.
Das ist richtig.
Solange du aber nur einen menu_entry_t aus deinem Array
zurückliefern willst ohne ihn zb. zu modifizieren, benötigst
du die Variable 'res' aber auch gar nicht.
1 | menu_entry_t* get_menu_entry(uint8_t id)
|
2 | {
|
3 | if( id > MAX_NR_ENTRIES )
|
4 | return NULL;
|
5 |
|
6 | return &test_menu[id];
|
7 | }
|
kniffliger wird es, wenn der Eintrag aus dem Array vor der
Rückgabe noch modifiziert werden soll. Dann, wie du richtig
sagst, geht das so nicht.
Dann musst du dich entscheiden: Wenn die Funktion einen Fehler
in id nicht melden muss (weil du zb fehlerfrei programmierst)
dann geht:
1 | menu_entry_t get_menu_entry(uint8_t id){
|
2 | menu_entry_t res;
|
3 |
|
4 | res = test_menu[id];
|
5 |
|
6 | res.type = WAS_WEIS_ICH_WAS;
|
7 |
|
8 | return res;
|
9 | }
|
Beachte: Ich lasse zuerst die komplette Struktur zuweisen
und modifiziere erst dann den einen Wert. Das ist grundsätzlich
besser, als alle Werte einzeln zu kopieren. Schon alleine aus
dem Grund, weil ich keinen Struktur Member vergessen kann.
bedeutet: kopiere das komplette Strukturobjekt, egal welche
und wieviele Member das sind. Bei einer Strukturänderung ( zb.
Member kommt hinzu) muss ich daher nicht darauf achten, dass
diese Funktion diese Änderung berücksichtigen muss. Der Compiler
kümmert sich darum, dass auch wirklich das komplette Struktur-Objekt
kopiert wird.
Wenn die Funktion aber in der Lage sein soll, einen Fehler zu
melden, dann macht man das so, dass die Funktion bereits
einen Eingangspointer erwartet, der auf eine Variable zeigen
muss, in dem die Funktion das Ergebnis ablegen soll. Zusätzlich
benutzt man dann den Returnwert um Erfolg oder Misserfolg anzuzeigen:
1 | menu_entry_t* get_menu_entry(uint8_t id, menu_entry_t* res)
|
2 | {
|
3 | if( id > MAX_NR_ENTRIES )
|
4 | return NULL;
|
5 |
|
6 | *res = test_menu[id];
|
7 | res->type = WAS_WEIS_ICH_WAS;
|
8 |
|
9 | return res;
|
10 | }
|