Ich möchte drei Arrays mit der gleichen Länge erstellen. Gemäß der Dokumentation müssen Arrays so definiert werden, int myArray[10];
dass 10 durch eine bekannte Länge (eine andere Ganzzahl) ersetzt oder mit einem Array gefüllt werden kann {2, 3, 5, 6, 7}
.
Allerdings, wenn ich einen Wert zu erklären versucht , int arrSize = 10;
und dann ein Array auf dieser Größe basiert int myArray[arrSize];
, erhalte ich die folgende: error: array bound is not an integer constant
.
Gibt es eine Möglichkeit, Array-Größen variabel zu bestimmen, oder muss ich sie nur fest codieren? (Mir wurde beigebracht, dass Hardcoding schlecht ist und etwas, das man um jeden Preis vermeiden sollte.)
programming
variables
code-optimization
user3.1415927
quelle
quelle
Antworten:
Ihre Frage besteht eigentlich aus 2 Teilen.
1 / Wie kann ich die konstante Größe eines Arrays außerhalb des Arrays deklarieren?
Sie können entweder ein Makro verwenden
oder verwenden Sie eine Konstante
Wenn Sie das Array initialisiert haben und dessen Größe wissen müssen, können Sie Folgendes tun:
Die zweite
sizeof
bezieht sich auf den Typ jedes Elements Ihres Arraysint
.2 / Wie kann ich ein Array haben, dessen Größe dynamisch ist (dh erst zur Laufzeit bekannt ist)?
Dafür benötigen Sie eine dynamische Zuweisung, die auf Arduino funktioniert, aber im Allgemeinen nicht empfohlen wird, da dies dazu führen kann, dass der "Heap" fragmentiert wird.
Sie können (C Weg) tun:
Oder (C ++ Weg):
Weitere Informationen zu Problemen mit der Heap-Fragmentierung finden Sie in dieser Frage .
quelle
ARRAY_SIZE = sizeof myArray / sizeof myArray[0];
diese Weise können Sie den Typ von myArray ändern, ohne Fehler einzuführen. Aus dem gleichen GrundmyArray = realloc(myArray, size * sizeof *myArray);
. Übrigens ist das Casting des Rückgabewerts vonmalloc()
oder auchrealloc()
unbrauchbar. 2) Das Prüfen aufmyArray != 0
in der C-Version ist sinnlos, wierealloc(NULL, sz)
es äquivalent zu istmalloc(sz)
.Die Größe des Arrays muss zur Kompilierungszeit bekannt sein. Andernfalls sollten Sie den Speicher dynamisch zuweisen, indem Sie Folgendes verwenden:
Dabei kann x (eine Ganzzahl) im Anwendungscode festgelegt werden (Sie können es aus eeprom laden, wenn Sie möchten, dass es eine dauerhafte, aber konfigurierbare Einstellung ist).
Wenn Sie jedoch nur einige Arrays derselben Größe deklarieren möchten, müssen Sie die Zahl nur als Konstante deklarieren:
Ich denke, Dinge nicht hart zu codieren, ist nur dann sinnvoll, wenn Sie vernünftigerweise erwarten, dass der Benutzer die Einstellung irgendwann ändern möchte. Ich weiß nicht, ob das der Fall ist.
quelle
Wenn Sie die maximale Länge des Arrays kennen, initialisieren Sie das Array einfach mit dieser Länge und geben Sie dem Programm mit einer Ganzzahl an, wie viel des Arrays verwendet werden soll. Wenn es sich um den Unterschied zwischen 7,10 Byte handelt, verschwenden Sie nicht so viel Speicherplatz.
quelle
Ich weiß, dass ich hier etwas spät dran bin, aber theoretisch können reguläre Arrays nicht mit einer Variablen erstellt werden, um die Anzahl der Elemente zu definieren, die das Array haben wird, wie in:
Dies zeigt einen Fehler an, da das Programm beim Deklarieren des Arrays erwartet, dass der Wert zwischen den Klammern eine Konstante ist. Es gibt jedoch eine Möglichkeit, ein Array mit einer Variablen zu erstellen, die die Anzahl der Werte definiert, die dieses Array durch dynamische Speicherzuweisung für Wertemengen haben soll (diese Methode wurde nur mit eindimensionalen Arrays getestet und noch nicht getestet) mehrdimensional noch), und es geht in etwa so:
Danach müssen Sie nur noch jedem Element, das in der Instanz myArray (die bereits ein Array ist) erstellt wurde, einen Wert zuweisen, wie bei einem normalen Array, das als myArray [arrSize] erstellt wurde.
quelle