Forum: Mikrocontroller und Digitale Elektronik Anfängerinproblem in C: struct und keine Ahnung


von claudia e. (Gast)


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...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.
von NichtWichtig (Gast)


Lesenswert?

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;
   }

von NichtWichtig (Gast)


Lesenswert?

Mist, zu langsam.

von Frage (Gast)


Lesenswert?

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
...

von Rolf M. (rmagnus)


Lesenswert?

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];

von Johnny B. (johnnyb)


Lesenswert?

Rolf M. schrieb:
> cRGB led;

Das würde nur gehen wenns einen typedef gibt, also etwa so:
1
typedef struct {
2
    ...
3
} cRGB;

von Frank M. (ukw) (Moderator) Benutzerseite


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.

: Bearbeitet durch Moderator
von Frage (Gast)


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.

von Frage (Gast)


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;
  }
}

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Frage (Gast)


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.  :-)

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Frage (Gast)


Lesenswert?

Hallo,

ja jetzt raff ich das auch. Sie will ein Array mit der Struktur anlegen. 
Man oh man. :-)

von claudia e. (Gast)


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!

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.