Array in Struktur

Gast #3173431
Lesenswert?

Hallo Forum,

in einer Struktur habe ich ein paar Arrays:
1
struct LEDstruct {
2
  uint8_t Rot[61];
3
  uint8_t Gruen[61];
4
  uint8_t Blau[61];
5
};

in einer Funktion sollen nun Werte der Arrays verändert werden:
1
for(i = 1;i<64;i++){
2
      h = Helligkeit[i];
3
      LEDPointer->Rot[g] = h;
4
      LEDPointer->Gruen[g] = h;
5
      LEDPointer->Blau[g] = h;
6
      LEDPointer->Rot[j] = h;
7
      LEDPointer->Gruen[j] = h;
8
      LEDPointer->Blau[j] = h;
9
      updateAll(LEDPointer);
10
        }
Komischerweise werden alle nicht in der Schleife gesetzten LEDs 
gelöscht. Warum?
Gast #3173435
Lesenswert?

Günter G. schrieb:

> for(i = 1;i<64;i++){
>       h = Helligkeit[i];
>       LEDPointer->Rot[g] = h;
>       LEDPointer->Gruen[g] = h;
>       LEDPointer->Blau[g] = h;
>       LEDPointer->Rot[j] = h;
>       LEDPointer->Gruen[j] = h;
>      LEDPointer->Blau[j] = h;
>       updateAll(LEDPointer);
>        }

woher sollen wir wissen was in g und j steht?

Und was macht updateAll? Ich befürchte fast, das hier eine kopie der 
stuktur gemacht wird.


> Komischerweise werden alle nicht in der Schleife gesetzten LEDs
> gelöscht. Warum?

das versteht niemand
Gast #3173439
Lesenswert?

Weil dein Programm fehlerhaft ist.

Nicht in dem gezeigten unvollständigen und nicht kompilierbaren 
Aussschnitt, sondern irgendwo anders. Zeig mal das genze Programm, oder 
zumindest den ganzen relevanten Abschnitt daraus.

Oliver
Gast #3173443
Lesenswert?

Hallo Peter,

das wird es vermutlich sein:
1
void updateAll(struct LEDstruct* LEDPointer){
2
  Write1(LEDPointer);
3
  Write2(LEDPointer);
4
  Write3(LEDPointer);
5
  Write4(LEDPointer);
6
  Write5(LEDPointer);
7
  Write6(LEDPointer);
8
  Write7(LEDPointer);
9
  Write8(LEDPointer);
10
  Write9(LEDPointer);
11
  Write10(LEDPointer);
12
  Write11(LEDPointer);
13
  Write12(LEDPointer);
14
}
#3173449
Lesenswert?

Mehr Code!

Aber:

Das hier
1
struct LEDstruct {
2
  uint8_t Rot[61];
3
  uint8_t Gruen[61];
4
  uint8_t Blau[61];
5
};

ist höchst wahrscheinlich verkehrt rum aufgezogen. Denn der logische 
Zusammenhang zwischen Rot/Grün/Blau ist stärker als die Tatsache, dass 
es 61 Stück davon gibt. D.h. das sollte so sein
1
struct LEDstruct {
2
  uint8_t Rot;
3
  uint8_t Gruen;
4
  uint8_t Blau;
5
};
Diese Struktur beschreibt 1 RGB-Led. Und davon, also von den RGB-Leds, 
hast du 61 Stück.
1
struct LEDstruct myLeds[61];

myLeds[5] wären dann zb die Daten der 6ten Led. Jede einzelne LED 
besteht aus einer Rot-Komponente, einer Gruen Komponente und einer Blau 
Komponente. Die Rot-Komponente der 6-ten LED ist dann myLeds[5].Rot 
Jetzt liest sich das auch von links nach rechts in einer logisch 
sinnvollen Art und Weise vom Groben zur Detailinformation.

    myLeds            das sind alle Leds
    myLeds[5]         das ist eine einzelne aus dem Pool aller Leds
    myLeds[5].Blau    das ist eine Farbe einer einzelnen Led aus
                      dem Pool aller Leds.

Stukturen muss man auch sinnvoll einsetzen. Sonst bringen sie nichts.
Gast #3173464
Lesenswert?

In main():
1
struct LEDstruct LEDs;
2
while(1)
3
    {
4
        loading(&LEDs);
5
    }
1
void loading(struct LEDstruct* LEDPointer){
2
  uint8_t sm;
3
  uint8_t sn;
4
  uint8_t j;
5
  uint8_t i;
6

7
  for(i = 1;i<61;i++){
8
    LEDPointer->Rot[i] = 0;
9
    LEDPointer->Gruen[i] = 0;
10
    LEDPointer->Blau[i] = 0;
11
  }
12
  updateAll(LEDPointer);
13

14
  j = 31;
15
  for(sn=30;sn>0;sn--){
16
    for(i = 1;i<64;i++){
17
      sm = Helligkeit[i];
18
      LEDPointer->Rot[sn] = sm;
19
      LEDPointer->Gruen[sn] = sm;
20
      LEDPointer->Blau[sn] = sm;
21
      LEDPointer->Rot[j] = sm;
22
      LEDPointer->Gruen[j] = sm;
23
      LEDPointer->Blau[j] = sm;
24
      updateAll(LEDPointer);
25
    }
26
   j++;
27
    updateAll(LEDPointer);
28
  }
29
  clearAll(LEDPointer);
30

31
}

Wird durch struct LEDstruct* LEDPointer eine neue Kopie erzeugt?
Gast #3173482
Lesenswert?

Also ich werde daraus nicht schlau.

Warum sind es mal 61, und mal 31?

Am besten, man definiert richtige Konstanten dafür.

Was soll die Variable sn? Kann man der nicht einen vernünftigen Namen 
geben, damit auch Unbeteiligte wissen, was das bedeutet?
Kommentare wären auch ganz nützlich.

Schleifen, die mit 1 beginnen, sind auch immer suspekt. Was ist mit dem 
0-Element?
Gast #3173489
Lesenswert?

Hallo,

ja, im Code werden alle LEDs erstmal auf 0 gesetzt.

Dann wird LED 30 und 31 hochgedimmt. Danach 29 und 32, da soll aber 30 
und 31 anbleiben, geht aber wieder aus.

Bei 1 fange ich deshalb an, weil es bei den LEDs auch mit eins losgeht 
und ich diese Stolperfalle weghaben wollte.
#3173508
Lesenswert?

> Bei 1 fange ich deshalb an, weil es bei den LEDs auch mit eins
> losgeht und ich diese Stolperfalle weghaben wollte.

Na wart mal ab.
Dieses 'bei 1 anfangen' ist die viel größere Stolperfalle.

Im übrigen bin ich raus. Ratespielchen kann ich mit meinem eigenen Code 
auch veranstalten. Den seh ich wenigstens komplett, auch wenn ich mir 
manchmal wünschen würde es wäre weniger.
#3173518
Lesenswert?

Günter G. schrieb:
> ja, im Code werden alle LEDs erstmal auf 0 gesetzt.

Okay, auch wenn ich die Verwendung von memset() erwägen würde. Oder 
clearAll()? Zumindest klingt das so.

> Dann wird LED 30 und 31 hochgedimmt. Danach 29 und 32, da soll aber 30
> und 31 anbleiben, geht aber wieder aus.

Und dafür soviel Rumgeschwätze im Code?
Hättest du wie Karl-Heinz schon sagte ein Array von Strukturen, könntest 
du auch das mit memset() erledigen. Und anstatt zwei Variablen 
unabhängig voneinander zu zählen, könnte dir auffallen, das etwas wie
1
for (i = 0; i < 30; ++i) {
2
  LEDPointer->Rot[30 - i] = ...
3
  LEDPointer->Rot[31 + i] = ...
4
}

dein Ansinnen ohne jeden weiteren Kommentar und zweiten Blick 
dokumentiert hätte.

> Bei 1 fange ich deshalb an, weil es bei den LEDs auch mit eins losgeht
> und ich diese Stolperfalle weghaben wollte.

Um dich nicht am Kaffee zu verbrennen, trinkst du ihn auch immer kalt? 
Das ist doch Käse, mal davon abgesehen, dass du so pro Farbei ein Byte 
(Index 0) verschwendest.

Apropos verschwenden: wieviel SRAM hat denn dein Controller? Passen da 3 
mal 61 Byte plus Stack plus was noch alles im geheimen Restcode 
verwendet wird rein? Oder wird vielleicht das Array durch eine der 
unzähligen lokalen Variablen überschrieben - wobei die wegoptimiert 
werden sollten, aber deine Compilerflags kennen wir ja auch nicht.

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