Mehrdimensionales Array deklarieren

Hallo,

gibt es eine Möglichkeit, ein mehrdimensionales Array nur teilweise zu deklarieren?

enum array {scale, full, factor};
uint8_t values[3][7];
values[scale][ ] = { 1, 7, 7, 7, 7, 7, 7 };
values[factor][ ] = { 1, 17, 17, 17, 17, 1, 1 };

Man könnte nun theoretisch auch,

enum array {scale, full, factor};
uint8_t values[3][7] = {
{1, 7, 7, 7, 7, 7, 7 },
{0,0,0,0,0,0,0};
{ 1, 17, 17, 17, 17, 1, 1 }
}

Die zweite Zeile spielt beim deklarieren keine Rolle. Vor der while-Schleife in der main wird der Wert mit values[full] = values[scale] * values[factor] gefüllt.

Mit einem sogenannten "jagged array". Also ein Array aus Zeigern auf Arrays

Das hatte ich hier mal beschrieben:

Damit kannst du auch die Zeiger auf NULL setzen und damit sagen "hier steht nichts"

sschultewolter:
Die zweite Zeile spielt beim deklarieren keine Rolle. Vor der while-Schleife in der main wird der Wert mit values[full] = values[scale] * values[factor] gefüllt.
[/quote]
Wenn Du die zweite Zeile des Arrays nicht mit Werten initialisieren möchtest, die zweite Zeile im späteren Verlauf aber trotzdem verwendet werden soll, lässt Du die zweite Zeile beim Initialisieren eben leer:
*_</em> <em><em>*uint8_t values[3][7] = { {1, 7, 7, 7, 7, 7, 7 }, {}, { 1, 17, 17, 17, 17, 1, 1 } };*</em></em> <em>_*

Das ist hier wohl die bessere Option. Bei einem jagged Array muss an beim Zugriff tunlichst aufpassen ob die Elemente überhaupt existieren. Das ist eher dafür gedacht wenn man Arrays will, bei denen die Teil-Arrays eine unterschiedliche Länge haben.

jurs:

sschultewolter:
Die zweite Zeile spielt beim deklarieren keine Rolle. Vor der while-Schleife in der main wird der Wert mit values[full] = values[scale] * values[factor] gefüllt.
[/quote]
Wenn Du die zweite Zeile des Arrays nicht mit Werten initialisieren möchtest, die zweite Zeile im späteren Verlauf aber trotzdem verwendet werden soll, lässt Du die zweite Zeile beim Initialisieren eben leer:
```
uint8_t values[3][7] = {
{1, 7, 7, 7, 7, 7, 7 },
{},
{ 1, 17, 17, 17, 17, 1, 1 }
};

```
[/quote]
So hatte ich das auch. Dachte, es geht vielleicht kürzer, in dem ich genau sage, in welche Zeile ich überhaupt die init machen möchte. Der Vorschlag von Serenfly ist zwar gut, aber ein tippersparnis ist es auch nicht.

sschultewolter:
So hatte ich das auch. Dachte, es geht vielleicht kürzer, in dem ich genau sage, in welche Zeile ich überhaupt die init machen möchte.

Brauchst Du die Werte der ersten und dritten Zeile denn überhaupt im weiteren Verlauf des Programms?

Wenn nicht, wäre es ja eine ziemliche RAM-Verschwendung, die erste und dritte Zeile überhaupt durch das ganze Programm mitzuschleppen und nicht gleich nur die zweiten Zeile des Arrays zu schreiben als:

uint8_t values[7] ={1*1, 7*17, 7*17, 7*17, 7*17, 7*1, 7*1 };

Hallo jurs,

im Programm nutzte ich es wie folgt. Wobei ich das Array nicht zwingend als global brauche, da ich den Zeiger auf das Array an die Funktionen übergebe.

Über einen Drehencoder ändere ich den Wert von [0][i]. Mögliche Werte sind hier 0 - 15. Diese muss ich jedoch hochskalieren auf 0 - 255. Somit multipliziere ich mit 17.