Forum: Mikrocontroller und Digitale Elektronik Werte einem Array zuweisen


von Stefan (Gast)


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

von Kindergärtner (Gast)


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
  }

von Markus B. (markusborti)


Lesenswert?

Grüß dich,

du hast das Array für sieben Elemente definiert, fügst aber immer 8 ein.
Das müsste eigentlich zu einem Overflow führen.

Den Tip von Kindergärtner finde ich prima.

Schöne Grüße

von Kindergärtner (Gast)


Lesenswert?

Markus Borti schrieb:
> du hast das Array für sieben Elemente definiert, fügst aber immer 8 ein.
> Das müsste eigentlich zu einem Overflow führen.
Nein, das ist in C schlicht und einfach nicht definiert. Man kann 
keine Arrays zuweisen/kopieren.

von Stefan (Gast)


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.

von Timmo H. (masterfx)


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

von Kindergärtner (Gast)


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.

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.