Anfängerinproblem in C: struct und keine Ahnung

Gast #5852178
Lesenswert?

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...
Beitrag #5852204 wurde von einem Moderator gelöscht.
Moderator Persönliche Seite #5852919
Lesenswert?

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.
Gast #5852928
Lesenswert?

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.
Gast #5852938
Lesenswert?

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;
  }
}
Gast #5852943
Lesenswert?

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.  :-)
Moderator Persönliche Seite #5852947
Lesenswert?

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.
Gast #5853102
Lesenswert?

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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren