Problem beim berechnen mit EEPROM Wert und zahlenwert

Folgender Teil meines Codes macht mir Probleme:

#define bars EEPROM.read(5)

#define univ EEPROM.read(6)

// Neopixel settings
const int numLeds = bars * 15; // change for your setup
const int numberOfChannels = numLeds * 3; 
const byte dataPin = 2;
Adafruit_NeoPixel leds = Adafruit_NeoPixel(numLeds, dataPin, NEO_GRB + NEO_KHZ800);

// Artnet settings
Artnet artnet;

const int startUniverse = univ; 

const int maxUniverses = numberOfChannels / 512 + ((numberOfChannels % 512) ? 1 : 0);
bool universesReceived[maxUniverses];
bool sendFrame = 1;
int previousDataLength = 0;

in bars steht dann nur ein zahlenwert von 1-11 welcher mit 15 multipliziert werden soll.

jetzt macht aber genau dieses Multiplizieren Probleme, und ich weis leider nicht wie ich das in den griff bekommen soll. Jemand eine lösung?

fehlermeldung:

Arduino: 1.6.6 (Windows 7), Board: "Arduino Nano, ATmega328"

ArtnetNanoWs2812ohnedisplay:32: error: array bound is not an integer constant before ']' token

 bool universesReceived[maxUniverses];

                                    ^

D:\dokumente\Arduino\ArtnetNanoWs2812ohnedisplay\ArtnetNanoWs2812ohnedisplay.ino: In function 'void onDmxFrame(uint16_t, uint16_t, uint8_t, uint8_t*)':

ArtnetNanoWs2812ohnedisplay:159: error: 'universesReceived' was not declared in this scope

     universesReceived[universe - startUniverse] = 1;

     ^

ArtnetNanoWs2812ohnedisplay:163: error: 'universesReceived' was not declared in this scope

     if (universesReceived[i] == 0)

         ^

ArtnetNanoWs2812ohnedisplay:184: error: 'universesReceived' was not declared in this scope

     memset(universesReceived, 0, maxUniverses);

            ^

exit status 1
array bound is not an integer constant before ']' token

Die Größe von globalen statischen Arrays muss zur Compile-Zeit bekannt sein (lokale Arrays können in avr gcc dank einer GNU Erweiterung auch erst zur Laufzeit fest stehen)

Wenn das erst zur Laufzeit bekannt ist musst du das Array dynamisch anlegen duckt sich

Das wird genau angemeckert:

array bound is not an integer constant before ']' token

Der Rest sind Folge-Fehler

und wie löse ich das nun? soll ich denn eine if else frage einbauen damit das beim compile läuft? bitte kurze erklärung wie ich das löse.

psyqjo:
und wie löse ich das nun?

So, wie es bei diesem Fehler üblich ist eg

Was Du im Ursprungsposting fragst und was der Fehler ist, sind unterschiedliche Dinge.

Gruß

Gregor

https://de.wikibooks.org/wiki/C%2B%2B-Programmierung/Speicherverwaltung#Array-new_und_Array-delete.0A.0A_.5BBearbeiten.5D
Dynamische Strukturen in C++
http://www.tschallener.net/cpp/dynvar.html

ich werde da einfach nich schlau draus

Erzeugt beim Start ein Array dynamischer Größe füllt es mit “zufälligem” Inhalt:

const int size = 10;
int* array = new int[size];

void setup()
{
  Serial.begin(9600);

  for (int i = 0; i < size; i++)
   array[i] = random(0, 500);

  Serial.print("size: "); Serial.println(size);
  for (int i = 0; i < size; i++)
    Serial.println(array[i]);
}

void loop()
{
}

Das das zur Laufzeit des gesamten Programms existiert braucht man kein delete

const int maxUniverses = numberOfChannels / 512 + ((numberOfChannels % 512) ? 1 : 0);

Ist ziemlich unübersichtlich, mein Vorschlag:

const int maxUniverses = (numberOfChannels + 511) / 512;

Serenifly:
Das das zur Laufzeit des gesamten Programms existiert braucht man kein delete

Wobei delete in der avr-libc eh nicht vorkommt.

Gruß

Gregor

Das wird von der Arduino IDE implementiert

Ein Punkt bei der Sache ist übrigens dass man das auch in zwei Schritten machen kann. Also man kann global nur den Zeiger deklarieren und den Speicher dann in einer Funktion anlegen.

Serenifly:
Das [delete()] wird von der Arduino IDE implementiert

Ah, wieder so ein Ding, das in der Referenz nicht auftaucht!

Gruß

Gregor

PS: Was macht eigentlich der Banzi? Unterrichtet der noch oder zählt der nur noch Geld?