Werte einem Array zuweisen

Gast #3291031
Lesenswert?
• ▲
▼
Ich habe ein kleines Programm, welches sich werte für das Array aus 
einer Switch-Anweisung holt.
1
void blinklicht(unsigned long wartezeit, unsigned int modus) {
2
  unsigned long aktuelleZeit = millis();
3
  static unsigned long vorherigeZeit;
4
  static int j;
5
  int rgbModus[7];
6

7
  switch(modus) {
8
  case 0: 
9
    rgbModus[] = {
10
      0, 2, 4, 6, 1, 3, 5, 7                          }; // RB RB RB RB
11
    break;
12
  case 1: 
13
    rgbModus[]  = {
14
      1, 3, 5, 7, 0, 2, 4, 6                          }; // BR BR BR BR
15
    break;
16
  case 2: 
17
    rgbModus[]  = {
18
      0, 1, 4, 5, 2, 3, 6, 7                          }; // RR BB RR BB
19
    break;
20
  case 3: 
21
    rgbModus[]  = {
22
      2, 3, 6, 7, 0, 1, 4, 5                          }; // BB RR BB RR
23
    break;
24

25
  case 4: 
26
    rgbModus[]    = {
27
      0, 1, 2, 3, 4, 5, 6, 7                          }; // RR RR BB BB
28
    break;
29
  case 5: 
30
    rgbModus[]    = {
31
      4, 5, 6, 7, 0, 1, 2, 3                          }; // BB BB RR RR
32
    break;
33

34
  case 6: 
35
    rgbModus[]    = {
36
      2, 3, 4, 5, 0, 1, 6, 7                          }; // BB RR RR BB
37
    break;
38
  case 7: 
39
    rgbModus[]    = {
40
      0, 1, 6, 7, 2, 3, 4, 5                          }; // RR BB BB RR
41
    break;
42

43
  default:
44
    modus = 0;
45
  }
46

47
  if(aktuelleZeit - vorherigeZeit > wartezeit) {
48
    j = 1;
49
    if(aktuelleZeit - vorherigeZeit > wartezeit * 2) {
50
      j = 0;
51
      vorherigeZeit = aktuelleZeit;
52
    }
53
  }
54

55
  if(j == 1)
56
  {
57
    for(int k = 0; k < 4; k++) ShiftPWM.SetRGB(rgbModus[k], 255, 0, 0);
58
    for(int k = 4; k < 8; k++) ShiftPWM.SetRGB(rgbModus[k], 0, 0, 255); 
59
  }
60
  else
61
  {
62
    for(int k = 0; k < 4; k++) ShiftPWM.SetRGB(rgbModus[k], 255, 0, 0);
63
    for(int k = 4; k < 8; k++) ShiftPWM.SetRGB(rgbModus[k], 0, 0, 255);   
64
  }
65
}

sketch_aug22a:52: error: expected primary-expression before ']' token
sketch_aug22a:52: error: expected primary-expression before '{' token
sketch_aug22a:52: error: expected `;' before '{' token
Gast #3291035
Lesenswert?
• ▲
▼
Warum der Aufwand, jedes mal das komplette Array zu kopieren?!
1
static const int rgbModus [][] = {{ 0, 2, 4, 6, 1, 3, 5, 7}, {1, 3, 5, 7, 0, 2, 4, 6 }, /* .... */ };
2
  // ...
3
  if(j == 1)
4
  {
5
    for(int k = 0; k < 4; k++) ShiftPWM.SetRGB(rgbModus[modus][k], 255, 0, 0);
6
    for(int k = 4; k < 8; k++) ShiftPWM.SetRGB(rgbModus[modus][k], 0, 0, 255); 
7
  }
8
  else
9
  {
10
    for(int k = 0; k < 4; k++) ShiftPWM.SetRGB(rgbModus[modus][k], 255, 0, 0);
11
    for(int k = 4; k < 8; k++) ShiftPWM.SetRGB(rgbModus[modus][k], 0, 0, 255);   
12
  }
Gast #3291117
Lesenswert?
• ▲
▼
1
void blinklicht(unsigned long wartezeit, unsigned int modus) {
2
  unsigned long aktuelleZeit = millis();
3
  static unsigned long vorherigeZeit;
4
  static int j;
5

6
  static int rgbModus[][8] = {
7
    {
8
      0, 2, 4, 6, 1, 3, 5, 7        }
9
    , // RB RB RB RB
10
    {
11
      1, 3, 5, 7, 0, 2, 4, 6        }
12
    , // BR BR BR BR
13
    {
14
      0, 1, 4, 5, 2, 3, 6, 7        }
15
    , // RR BB RR BB
16
    {
17
      2, 3, 6, 7, 0, 1, 4, 5        }
18
    , // BB RR BB RR    
19
    {
20
      0, 1, 2, 3, 4, 5, 6, 7        }
21
    , // RR RR BB BB
22
    {
23
      4, 5, 6, 7, 0, 1, 2, 3        }
24
    , // BB BB RR RR
25
    {
26
      2, 3, 4, 5, 0, 1, 6, 7        }
27
    , // BB RR RR BB
28
    {
29
      0, 1, 6, 7, 2, 3, 4, 5        }
30
    , // RR BB BB RR
31
  };
32
  
33
  if(modus < 8) {
34
    if(aktuelleZeit - vorherigeZeit > wartezeit) {
35
      j = 1;
36
      if(aktuelleZeit - vorherigeZeit > wartezeit * 2) {
37
        j = 0;
38
        vorherigeZeit = aktuelleZeit;
39
      }
40
    }
41

42
    if(j == 1)
43
    {
44
      for(int k = 0; k < 4; k++) ShiftPWM.SetRGB(rgbModus[modus][k], 255, 0, 0);
45
      for(int k = 4; k < 8; k++) ShiftPWM.SetRGB(rgbModus[modus][k], 0, 0, 255); 
46
    }
47
    else
48
    {
49
      for(int k = 0; k < 4; k++) ShiftPWM.SetRGB(rgbModus[modus][k], 0, 0, 255);
50
      for(int k = 4; k < 8; k++) ShiftPWM.SetRGB(rgbModus[modus][k], 255, 0, 0);   
51
    }
52
  }
53
  else {
54
    Serial.print("Falsche Eingabe! Wert '"); 
55
    Serial.print(modus); 
56
    Serial.println("' darf nicht hoeher '8' sein!");
57
  }
58
}

So passt es nun, die Frage ist, warum "  static int rgbModus[][8] = {" 
nötig ist. Wir hier wieder die Zahl von 1-8 angegeben?

Bei [7] bekomme ich mecker vom Compiler das zuviele Werte vorhanden 
sind.
#3291184
Lesenswert?
• ▲
▼
Stefan schrieb:
> So passt es nun, die Frage ist, warum "  static int rgbModus[][8] = {"
> nötig ist. Wir hier wieder die Zahl von 1-8 angegeben?
Ich weiß zwar jetzt nicht genau was du meinst, aber bei der Deklaration 
des Arrays wird die Größe angegeben (8 Elemente), die Indizierung geht 
aber von 0-7. Wenn du von 1-8 haben willst musst du Basic als 
Programmiersprache nehmen ;)
Gast #3292264
Lesenswert?
• ▲
▼
Stefan schrieb:
> So passt es nun, die Frage ist, warum "  static int rgbModus[][8] = {"
> nötig ist. Wir hier wieder die Zahl von 1-8 angegeben?
Jedes der "Unter-Arrays" muss gleich groß sein, und damit C weiß wie 
groß, muss man es angeben.
Das "static const" sorgt dafür dass die Daten nicht jedes Mal in den 
lokalen Speicher (Stack) kopiert werden müssen, sondern 1x in den Flash 
geschrieben werden und von da direkt verwendet.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.