Forum: Mikrocontroller und Digitale Elektronik Probleme, struct zu übergeben und Größe zu bestimmen


von Simon (Gast)


Lesenswert?

Hallo,

wie kann ich ein struct-Array übergeben und die Größe innerhalb einer 
Funktion bestimmen?
1
struct rgb{uint8_t r; uint8_t g; uint8_t b;}
2
//..
3
struct rgb gruppe1[12]; //12xR, 12xG, 12xB
4
struct rgb gruppe2[3]; //3xR, ...
5
6
7
uint8_t myfunc(struct rgb *leds)
8
{
9
uint8_t num = sizeof(ledarray);  // Liefer nicht den richtigen Wert zurück
10
for(uint8t_t i = 0; i < num; i++) leds[i].r = 100;
11
return num;
12
}
13
14
int main(void)
15
{
16
myfunc(gruppe1); // Rückgabe 2
17
myfunc(gruppe2); // Rückgabe 2
18
}

von sklick auf Beitragstit (Gast)


Lesenswert?

>wie kann ich ein struct-Array übergeben und die Größe innerhalb einer
>Funktion bestimmen?

Gar nicht.

In C gibt es keine Arrays als Funktionsargumente.

Array-Grösse muss als separates Arg übergeben werden.

Steht alles in Deinem C-Buch.

von g457 (Gast)


Lesenswert?

> uint8_t num = sizeof(ledarray);  // Liefer nicht den richtigen Wert zurück

Jeder anständige C-Compiler sagt Dir das als Warnung - jene sind 
entgegen landläufiger Meinung halt nicht dazu da, um ignoriert zu 
werden.

> Array-Grösse muss als separates Arg übergeben werden.

Nein, muss nicht(tm). Wenn man sich das Argument um jeden Preis sparen 
will kann man sich auch einfach eine 'end-of-array'-Marke setzen. Bei 
einem C-Style String wäre das 0. Der TO könnte eine Farbe definieren 
bzw. reservieren, die dafür herhalten muss.

Was schöner oder einfacher ist hängt aber immer vom Kontext ab. Ich 
würde
1
sizeof(gruppex) /sizeof(gruppex[0])
 in die Liste der tatsächlichen Parameter mit aufnehmen, ggf. auch in 
ein schönes Makro à la
1
#define GIB_MICH_GROESSE(x)    (sizeof(x) /sizeof((x)[0]))
 verpackt.

HTH und nix für ungut.

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.