Werte einem Array zuweisen

Gast #3291031
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
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 #3291086
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.
Gast #3291117
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
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
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

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.