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

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