Forum: Compiler & IDEs struct als Referenz


von Meier (Gast)


Lesenswert?

Wie muss das richtig aussehen, dass ich ein struct als Referenz nutzen 
kann, so das die Werte auch bzw das Struct mit den aktualisierten Werten 
wieder zurückgegeben wird.

1
struct cfg {uint8_t i; uint8_t j;}
2
3
void func(struct cfg *a)
4
{
5
cfg.i = 1;
6
cfg.j = 2;
7
}
8
9
int main()
10
{
11
struct cfg cfg0;
12
13
func(&cfg0);
14
if(cfg.i == 1) out();
15
}

von Karl H. (kbuchegg)


Lesenswert?

Meier schrieb:
> Wie muss das richtig aussehen, dass ich ein struct als Referenz nutzen
> kann, so das die Werte auch bzw das Struct mit den aktualisierten Werten
> wieder zurückgegeben wird.
>
>
>
1
struct cfg {uint8_t i; uint8_t j;}
2
> 
3
> void func(struct cfg *a)
4
> {
5
> cfg.i = 1;
6
>

cfg kommt da schon überhaupt schon mal nicht vor. cfg ist der 
Datentypname der STruktur. Die Variable heisst 'a' und ist ein Pointer:
1
   a->i = 1;

und
> mit den aktualisierten Werten wieder zurückgegeben wird.
zurückgegeben wird da überhaupt nichts. Über den Pointer veränderst du 
direkt das Original des Aufrufers.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Naja, wenn das C++ ist (dann gibt es auch Referenzen), dann könnte man 
das auch so ändern:
1
struct cfg {uint8_t i; uint8_t j;}
2
3
void func(struct cfg &a)  // <--
4
{
5
  cfg.i = 1;
6
  cfg.j = 2;
7
}
8
9
int main()
10
{
11
  struct cfg cfg0;
12
13
  func(cfg0);             // <--
14
15
  if (cfg.i == 1) 
16
    out();
17
}

von Eric B. (beric)


Lesenswert?

Rufus Τ. F. schrieb:
> Naja, wenn das C++ ist (dann gibt es auch Referenzen), dann könnte man
> das auch so ändern:
>
>
1
> struct cfg {uint8_t i; uint8_t j;}
2
> 
3
> void func(struct cfg &a)  // <--
4
> {
5
>   cfg.i = 1;
6
>   cfg.j = 2;
7
> }
8
>

aber dann immer noch
1
    a.i = 1;
2
    a.j = 2;

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Richtig. Das hatte ich übersehen.

von Markus F. (mfro)


Lesenswert?

Rufus Τ. F. schrieb:
> Naja, wenn das C++ ist (dann gibt es auch Referenzen), dann könnte man
> das auch so ändern:
>
...

... und (wenn auch mit ein wenig Overhead) in beiden Sprachen geht:
1
struct cfg {uint8_t i; uint8_t j;}
2
3
struct cfg func(struct cfg a)
4
{
5
  a.i = 1;
6
  a.j = 2;
7
8
  return a;
9
}
10
11
int main()
12
{
13
  struct cfg cfg;
14
15
  cfg = func(cfg);
16
17
  if (cfg.i == 1)
18
    out();
19
}

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.