Wenn ich aber ein mehrdimensionales Array nur teilweise mit Werten fülle:
byte werte[][3] ={ {3, 1, 7}, {2, 5} };
... kann ich dann irgendwie an die Information kommen (ausser alle ausprobieren!), wieviele Werte in den Spalten des Arrays vorhanden sind (im zweiten Beispiel also 3 und 2)? Also kann ich der Funktion sizeof irgendwie einen Parameter übergeben um sie auf eine bestimmte Spalte eines Arrays anzuwenden?
Im Zweifel könnte ich natürlich ein Array anlegen, in dem ich zu Programmstart die Anzahlen 'reinschreibe ... aber das muss doch einfacher gehen ...
Tja, allerdings interessiert mich ja gerade wieviele Werte vorhanden sind. In der ersten Spalte wären das 3 und in der zweiten Spalte wären das 2. Dein Vorschlag gibt mir die Anzahl der Spalten aus. Ein Test mit sizeof(werte[1]) gibt mir ganz dogmatisch immer "3" aus, da ich es ja selbst mit 3 dimensioniert habe. Es sind aber nur 2 Werte drinne.
Wahrscheinlich muss ich mir mit
if (anzahlen[i][j] == "") {//schreibe ein neues Array, welches die Anzahlen des wert-Arrays enthält}
Das Problem hierbei ist, dass der Speicher reserviert wird auch wenn er nicht verwendet wird. Auch wenn du nur 2 Elemente belegst, ist Speicher für 3 reserviert. Sieht man schön im Visual C++ Debugger. Und das ist was sizeof() zurück gibt.
Was du willst ist ein sogenanntes "jagged array", d.h. Pointer auf ein Array. Aber dann kannst du auch nicht über die oberste Array Variable (hier "jagged") auf die Größe der anderen Arrays zugreifen.
kuahmelcher:
Ein Test mit sizeof(werte[1]) gibt mir ganz dogmatisch immer "3" aus, da ich es ja selbst mit 3 dimensioniert habe. Es sind aber nur 2 Werte drinne.
Nein, wenn Du drei Werte deklarierst, sind auch drei Werte drin. Immer!
Normalerweise wird ein deklariertes Array mit Nullen als Werte inititialisiert.
Wenn Du nur einen Teil des deklarierten Arrays initialisierst, sind in den restlichen deklarierten Werten eben Nullen drin.
Wenn Du wissen möchtest, wieviele von Null verschiedene Werte in einer Zeile oder Spalte enthalten sind, oder welches der Index in einer Zeile oder Spalte ist mit dem letzten Nicht-Null Wert, dann mußt Du das in einer for-Schleife ermitteln.
Daran hatte ich auch schon gedacht. Geht aber schief wenn man wirklich mal eine 0 abspeichern will!
Dann bleibt Dir nichts anderes übrig daß Du bei jedem Abspeichern von Daten ins Array auch einen/mehrere Zähler updatest und so selbst die Größe des belegten Arrays dokumentierst.
Für was brauchst Du das eigentlich?
Grüße Uwe
uwefed:
Dann bleibt Dir nichts anderes übrig daß Du bei jedem Abspeichern von Daten ins Array auch einen/mehrere Zähler updatest und so selbst die Größe des belegten Arrays dokumentierst.
Für was brauchst Du das eigentlich?
Grüße Uwe
Ja, es sieht so aus, als müsste ich parallel zum eigentlichen array ein zweites array mit den Anzahlen der Einträge pflegen. humpf
Aber wir sind ja hier nicht bei PHP!
Also wozu ich das brauche: Ich bastle mir gerade mit dem "Sainsmart LCD Keypad-Shield" ein Menü. Es hat drei Kategorien, die mit den links- und rechts-Buttons angewählt werden können. Jede Kategorie hat aber noch eine unterschiedliche Anzahl an Unterkategorien, die mit den rauf- und runter-Buttons angewählt werden. Diese Unterkategorien habe ich alle in ein mehrdimensionales Array gesteckt. Das hat dann in der ersten Spalte/Kategorie 10 Werte, in der zweiten Spalte/Kategorie nur 3 Werte und in der dritten Spalte/Kategorie vielleicht nur 2 Werte. Irgendwann ist in jeder Kategorie ein Ende erreicht. In der ersten Kategorie eben nach 10 Eeinträgen, in der zweiten Kategorie nach 3 Einträgen usw. Nun soll aber am "Ende" ein weiterer Druck auf den Hoch- oder Runterknopf nichts mehr bewirken, weil ja keine Unterkategorien mehr da sind. Und da wäre es eben praktisch, wenn man einfach herausfinden könnte, wieviele Einträge bzw. Unterkategorien in der Array-Spalte enthalten sind.
Aber ist nicht so schlimm. Entweder ich pflege zusätzlich ein Array mit Anzahlen oder ich frage ab, dass der Rauf-Knopf nur DANN funktioniert, wenn der nächste Eintrag != ""/"0" ist. Das wird nur dann schwierig, wenn tatsächlich eine 0 abgespeichert wird, das ist nämlich der Fall!
Momentan habe ich die Anzahlen in einer IF-Abfrage gespeichert und das ist schlecht. Sowas vergesse ich grundsätzlich nach kurzer Zeit und baue mir damit Fallstricke, die ich dann sehr zeitaufwändig suchen muss. Am Ende beisse ich meistens in die Tischkante vor Ärger.
Mit dynamischer Speicherverwaltung wäre das kein Problem. In C++ macht man sowas mit Arrays aus Vektoren (mit fester Größe im Konstruktor(!), weil sie nicht wachsen müssen). Aber man kann auch leicht selbst z.B. ein struct schreiben, das ein Array und dessen Größe dynamisch verwaltet.
Es gibt eine STL Implementierung für den Arduino mit einer Vektor Klasse, die wenig Overhead haben soll:
(da fehlt nur das "#include " damit es auch kompiliert)
Davon wird bei so kleinen Prozessoren i.d.R. abgeraten, aber laut den Tests dort gehen die leichtgewichtigen Klassen ohne Probleme. Selbst ausprobiert habe ich es auf Dauer noch nicht.