Array in Struktur

Gast #3173431
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
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
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
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
}
Gast #3173447
Günter G. schrieb:
> Hallo Peter,
> das wird es vermutlich sein:
> void updateAll(struct LEDstruct* LEDPointer){

nein ist es nicht, du übergibst einen Zeiger das ist schon ok.

Aber ich(wir) verstehen das Problem immer noch nicht. Zeige den gesamten 
code.
#3173449
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
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?
#3173471
Günter G. schrieb:

> Wird durch struct LEDstruct* LEDPointer eine neue Kopie erzeugt?

Nein. Du brauchst ganz dringend ein C-Buch

Und gewöhn dich daran, dass wir in C

  for(i = 1;i<61;i++){

bei 0 anfangen zu zählen!

Ein Array mit 3 Elementen

int arr[3];

besteht aus den Elementen

  arr[0]
  arr[1]
  arr[2]

zähl nach, sind genau 3 Stück.
#3173475
Und dein gezeigter Code hilft immer noch nicht zu erklären, was du unter

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

eigentlich genau verstehst, bzw. wie man dieses 'gelöscht' deuten soll. 
Was sind 'nicht alle'?
Gast #3173482
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
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
> 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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.