Verschiedene Variablen mit der gleichen Funktion ansprechen

Ich hätte hier mal wieder eine kleine Problemstellung :slight_smile:

Angenommen ich habe eine Funktion, diese Funktion soll anhand einer übergebenen Variable Daten aus dazu passenden Variablen bzw. Arrays holen.

Also wenn ich z.B. 5 an die Funktion übergebe, soll sie die Werte aus dem Array meine_daten_5[] sowie meine_farben_5[] und meine_groessen_5[] holen. Wenn ich eine 8 übergebe müssen es sinngemäß meine_daten_8[], meine_farben_8[] und meine_groessen_8[] sein.

Meine momentane Lösung sind mehrdimensionale Arrays, also z.b.
meine_daten[10][20] = {{1,2,3,4,5,...,19,20},{21,22,23,...}...};
ich kann dann wunderbar die Daten mit meine_daten[uebergabe][ x ] holen.

Mein Problem an der Sache ist, dass jeder Teil des Arrays nicht unbedingt 20 Elemente haben muss, evtl hat meine_daten[8] nur 15 Elemente.
Und mein schlechtes Gewissen behauptet dass die restlichen 5 Elemente dann trotzdem entsprechend Platz belegen auch wenn ich gar nichts reingeschrieben hab.

Abgesehen davon möchte ich evtl auch mal einen Datensatz als BOOLEAN haben und den nächsten als INT.

Gibt es denn eine Möglichkeit wie ich das besser lösen kann?

Nur um mal den Zweck dahiner zu verdeutlichen:
Ich möchte (bzw habe) eine Funktion, die ein Icon aufs Display malt, dieses Icon ist zusammen mit anderen Icons in Arrays gespeichert. Die Funktion soll universal aufzurufen sein, und ich möchte eben als Übergabeparameter nur noch angeben welches Icon gemalt werden soll und die Koordinaten wo es im Display hin muss.
Mit kleinen schwarzweißen Icons (momentan hab ich welche mit 8x14 und 9x14) funktioniert das schon recht gut, aber ich will mehr, und das alles mit ordentlichem code :wink:

Zeitsklave:
das alles mit ordentlichem code :wink:

Ordentlich macht man das objektorientiert.
Das heißt du legst dir eine Klasse Icon mit den entsprechenden Attributen für Farben und Größen an. Wenn du verschiedenartige Icons hast, also z. B. schwarzweiße, farbige, evtl Buttons, etc. sollte man das ganze als Unterklassen von Icon realisieren, die alle die Methode draw() - entprechend angepasst - implementieren. Außerdem kannst du dann, wenn du von einer gemeinsamen Oberklasse (Icon) erbst, ein Array aus Icons anlegen, die alle zu unterschiedlich ausgebildeten Unterklassen gehören. Zur Objektorientierung in C++ findest du zig Tutorials im Internet und in jedem C++ Lehrbuch.
Bzgl boolean und int: Wenn du schwarzweiß/Farbe damit unterscheiden willst, dann sparst du dir nicht so viel Speicher wie du denkst. Jeder boolean frisst nämlich ein ganzes byte Speicher. Um monochrome Bitmaps zu speichern, legt man die Daten bitweise an, d.h. immer 8 pixel werden zu einem byte zusammengefasst. Achte aber auch darauf, dass du nicht einfach immer aus Faulheit "int" schreibst, für die meisten Fälle reicht "byte".
Du kannst - wenn du den objektorientierten Ansatz nimmst - einfach ein Attribut "Farbtiefe" anlegen, das angibt wie viel Bit zu einem Pixel gehören, und dann die Daten einfach als Array aus bytes speicherst.
Gruß,
Marv

Dass ein Boolean auch ein ganzes Byte braucht, war mir neu... Dann werde ich mal lieber mit Bytes und bitRead oder so arbeiten :wink:

Um objektorientiertes Programmieren hab ich mich bisher immer drücken können, für mich ist das irgendwie ein Buch mit sieben Siegeln - vollkommen undurchsichtig. Vielleicht sollte ich mich bei Gelegenheit mal intensiv damit beschäftigen...
Allerdings hab ich auch hier im Forum gelesen, dass es bei Arduino nicht unbedingt sinnvoll ist... oder ist mein Fall ein Beispiel wo es Sinn machen kann?

Hallo,

irgenwann kommt man um Objektprogrammierung nicht mehr drum herum. Hab ich am eigenen Leib erfahren müssen. Dann muß man sich damit beschäftigen und verstehen lernen.

Übrigens hat das nichts mit "Arduino" zu tun. Arduino steht nur für den vereinfachten Zugang zu einem µC Board und einer einfach gehaltenen Programmierumgebung. Im Kern steckt aber das komplette Atmel Paket. Du kannst also sämtliche "Arduino Komfortbefehle" in der IDE weglassen und programmieren wie ein Mann. :slight_smile: Dann mußte Dich aber auch um sämtliche Register selbst kümmern. Das schöne an der Arduio IDE ist, man kann mischen wie man möchte. Man nimmt gewöhnlich die Komfortbefehle und wenn es zeitkritisch wird kann man immer noch gewisse Dinge direkt programmieren. Wie das geht steht entweder im µC Datenblatt oder liest mal im mikrocontroller.net/forum

Das ganze Arduino System ist auch OOP. Jedesmal wenn du print()/println() machst verwendest du Vererbung und virtuelle Funktionen. Also genau was MGOS vorgeschlagen hat