Hallo liebes Forum, ich wollte gerade mal wieder einen ws2812b-Strip zum Leuchten bringen. Dabei benutze ich die light_ws2812-lib, was ich auch schon öfter gemacht habe. Ich benutze ebenso Code, der schon öfters funktioniert hat (hab mit alten Projekten verglichen, mir fällt keine Änderung auf, allerdings gibt AtmelStudio 6.2 mir folgende Fehlermeldung: request for member 'g' in something not a structure or union Wie gesagt, das hat alles schonmal funktioniert, einen alten Code mit der gleichen Vorgehensweise kann ich auch ohne Fehler kompilieren. Ich checks nicht... Hier sind mal die relevanten Codehäppchen: in der light_ws2812.h wird die struct definiert: struct cRGB { uint8_t g; uint8_t r; uint8_t b; }; in meinem Code dann: #include "light_ws2812.h" ... #define MAXPIX 10 ... struct cRGB led[MAXPIX]; ... void fill_struct(void) { for (uint16_t i = 0; i < MAXPIX; i++) { led.r[i] = 100; led.g[i] = 100; led.b[i] = 255; } } Dann kommt oben genannter Fehler. Bin mir recht sicher, dass ich es schon öfter genauso gemacht habe, ohne Probleme. Die light_ws2812.h habe ich über add -> existing item angehängt und sie liegt auch im Projekteordner. Das ändern in Pfeile anstelle des Punktes (was AS immer automatisch machen möchte, wenn ich einen Punkt setze) bringt folgende Fehlermeldung: subscripted value is neither array nor pointer nor vector. Ich mach das alles nur zum Hobby und hab mir den ganzen Krempel bisher selbst beigebracht, so richtig durchsehen tu ich nich in C, aber bisher hats irgendwann immer gereicht.Über Hinweise freue ich mich, muss jetzt aber los und kann erst heute Nacht antworten... Danke für etwaige Hilfe und einen schönen Abend euch allen...
claudia e. schrieb: > led.r[i] = 100; led.g[i] = 100; led.b[i] = 255; Damit das richtig ist, müsste Deine Strukturdefinition so aussehen:
1 | struct cRGB { uint8_t g[MAXPIX]; uint8_t r[MAXPIX]; uint8_t b[MAXPIX]; }; |
So sieht sie aber nicht aus. Probier' mal:
1 | led[i].r = 100; |
Beitrag #5852204 wurde von einem Moderator gelöscht.
claudia e. schrieb: > void fill_struct(void) > { > for (uint16_t i = 0; i < MAXPIX; i++) > { > led.r[i] = 100; led.g[i] = 100; led.b[i] = 255; > } > } Probier mal so. for (uint16_t i = 0; i < MAXPIX; i++) { led[i].r = 100; led[i].g = 100; led[i].b = 255; }
Ihr überseht etwas.
1 | |
2 | #include "light_ws2812.h" |
3 | |
4 | struct cRGB { uint8_t g; uint8_t r; uint8_t b; }; |
5 | |
6 | cRGB led; |
7 | |
8 | ...
|
9 | |
10 | #define MAXPIX 10
|
11 | |
12 | ...
|
Frage schrieb: > Ihr überseht etwas. > cRGB led; Also ich hab jetzt dreimal den Code angeschaut und kann diese Zeile nirgends finden. Sie würde auch keinen Sinn machen. Der Code enthält aber diese Zeile:
1 | struct cRGB led[MAXPIX]; |
Rolf M. schrieb: > cRGB led; Das würde nur gehen wenns einen typedef gibt, also etwa so:
1 | typedef struct { |
2 | ... |
3 | } cRGB; |
Johnny B. schrieb: > Rolf M. schrieb: >> cRGB led; Falsch zitiert, das hat "Frage" (Gast) geschrieben und nicht Rolf. > Das würde nur gehen wenns einen typedef gibt Das geht aber durchaus in C++, und zwar genau so. Der Benutzer "Frage" (Gast) hat da wohl was durcheinandergeworfen - vielleicht durch Arduino oder ähnliches. Da es hier um C geht, kann man den kontextlosen Einwurf von "Frage" (Gast) getrost ignorieren.
:
Bearbeitet durch Moderator
Hallo, ja in C++ gehts genau so. Struktor anlegen und Objekt erstellen.
1 | struct cRGB { |
2 | uint8_t g; |
3 | uint8_t r; |
4 | uint8_t b; |
5 | };
|
6 | |
7 | cRGB led; |
Das sich die Frage nur auf C bezog hatte ich leider übersehen. Sollte/könnte dann so aussehen.
1 | struct cRGB { |
2 | uint8_t g; |
3 | uint8_t r; |
4 | uint8_t b; |
5 | };
|
6 | |
7 | struct cRGB led; |
Aber egal wie. Die Konstante MAXPIX würde ich nicht als Parameter übergeben. Die ist ja schon fix.
Hallo nochmal, der eigentliche Fehler/Warnung?, wenn das mit der Struktur in C geklärt ist, steckt bestimmt in der Funktion beim Datentyp. Die Laufvariable i muss uint8 sein und nicht uint16. Weil uint16 passt ja nicht in die uint8 Struktur. [c] void fill_struct(void) { for (uint16_t i = 0; i < MAXPIX; i++) { led.r[i] = 100; led.g[i] = 100; led.b[i] = 255; } }
Frage schrieb: > struct cRGB led; Du hast hier noch die Kleinigkeit vergessen, dass hier ein Array benutzt wird, also struct cRGB led[MAXPIX]; Und das findest Du schon im Eröffnungsbeitrag.
Rolf M. schrieb: > Frage schrieb: >> Ihr überseht etwas. > >> cRGB led; > > Also ich hab jetzt dreimal den Code angeschaut und kann diese Zeile > nirgends finden. Sie würde auch keinen Sinn machen. > Der Code enthält aber diese Zeile: > struct cRGB led[MAXPIX]; genau das meinte ich ja und hatte es umgehend korrigiert gezeigt. Nur leider in C++ Syntax und nicht in C Syntax. :-)
Frage schrieb: > Die Konstante MAXPIX würde ich nicht als Parameter übergeben. Das macht die TO ja auch gar nicht. Frage schrieb: > led.r[i] = 100; led.g[i] = 100; led.b[i] = 255; Du übersiehst, wie das Array definiert ist. Falsch: led.r[i] = 100; Richtig: led[i].r = 100; Schon die erste Antwort im Thread war bereits die Lösung. Du stocherst hier an Stellen rum, die irrelevant sind.
Frage schrieb: > genau das meinte ich ja und hatte es umgehend korrigiert gezeigt. Du solltest den Eröffnungsbeitrag nochmals lesen: > struct cRGB led[MAXPIX]; Das steht da schon. Da fehlt nix! Die TO hat nur das [i] an die falsche Stelle geschrieben.
Hallo, ja jetzt raff ich das auch. Sie will ein Array mit der Struktur anlegen. Man oh man. :-)
Geilo, ihr Lieben, ihr seid die Besten! Das war das Problem und yo, jetzt läufts. Gestern abend hasste ich mein Hobby, jetzt liebe ich es wieder! Danke nochmal und einen wunderbaren Tag euch allen!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.