Probleme, struct zu übergeben und Größe zu bestimmen

Gast #4340363
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
}
Gast #4340372
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.
Gast #4340427
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.