Hallo zusammen!
Ich stehe vor einem Problem, wo ich noch keinen rechten Lösungsansatz gefunden habe. Vielleicht hat hier jemand eine zūndende Idee?
Folgende Aufgabenstellung:
Ich habe eine Tabelle, die in der ersten Spalte unsortierte Werte enthält. In der zweiten Spalte stehen willkürliche Werte. Die erste Spalte repräsentiert Zeitmarken, die zweite zugehörige Bitmuster, d.h. Bitmuster, die bei den jeweiligen Zeitmarken gesetzt werden sollen.
Jetzt soll die gesamte Tabelle nach den Werten in der ersten Spalte sortiert und die Werte der zweiten Spalte jeweils mitgenommen werden.
Das Sortieren der ersten Spalte kriege ich wohl hin, aber wie schaffe ich es, dass die zugehörigen Bitmuster mitgenommen werden?
Wenn Du bei der Sortierung den 1. Wert verschiebst, verschiebe auch den 2. Wert.
Oder baue aus 1. und 2. Wert ein struct, mache in Array draus und sortiere dieses.
Je nach Größe der Arrays konnte das for einen AVR (welchen?) etwwas viel sein.
volkhard_delfs:
Vielleicht hat hier jemand eine zūndende Idee?
...Das Sortieren der ersten Spalte kriege ich wohl hin, aber wie schaffe ich es, dass die zugehörigen Bitmuster mitgenommen werden?
Nun, ganz konkret falls die Tabellen Arrays sind:
Wenn Du in der Zeittabelle beim Sortieren Einträge anfasst, hast Du ja mit Indices in den Array zu tun, z.B. um Werte zu vertauschen. Mit exakt denselben Indicies vertauscht Du sofort auch die Werte im Bitmasken-Array.
Da bietet es sich an, eine Funktion zu schreiben, die die Operation auf beiden Arrays synchron durchführt.
Allerdings würde ich persönlich auch die Lösung aus dem qsort()-Beispiel bevorzugen - da musst Du nur die Vergleichsfunktion beistellen.
Hier, mal eben aus dem Ärmel geschüttelt, aus der Wühlkiste zusammen gestückelt.
Arbeitet allerdings mit Strukturen.
Ein Umbau auf SubArrays ist sicherlich möglich.
Im Prinzip schon...
Die ganzen Sprach Details stehen im Buch.
Ob qsort() erwähnt wird?
Weiß nicht, aber dafür gibts ja genug Dokus im Netz.
Ist schließlich keine Spracheigenschaft sondern teil der C oder C++ Library
Ja, die std Container habe ich außen vor gelassen, da sie auf den AVRs nicht so ohne weiteres zur Verfügung stehen.
Auch kann man natürlich auf die Operatorenüberladung verzichten, solange die Objekteigenschaften öffentlich sind. Die Überladung stammte noch aus der Wühlkiste.
Wem Operatoren überladen Spaß macht, der findet oft eine Gelegenheit.
Sehr hübsches Beispiel. Zeigt auch die Schönheit von c++, im Vergleich zur C-Funktion qsort mit ihrer compare callback Funktion mit void* Parametern.
Danke Combie.
Den Thread hab ich eigentlich wegen des Titels überflogen.
Interessant erscheint mir, dass "zweidimensionales Array" praktisch immer ein Designfehler (unglücklicher Denkansatz) ist und eigentlich ein eindimensionales Array eines entsprechend komplexeren Datentyps vorliegt.
Richtig!
Dieses ist eigentlich ein assoziatives Konstrukt.
Jedem Timestamp (key), ist ein value zugeordnet.
Einschränkung:
Wobei hier nicht klar ist, ob nicht auch Timestamps doppelt vorkommen dürfen.
--
Wem Operatoren überladen Spaß macht, ....
Eigentlich bin ich zu der Operatorenüberladung durch die EEPROM Klasse gekommen. Die hat den Impuls geliefert.
vorgefundene Konstruktionen wie
EEPROM[42]++;
oder
Wire << temperatur;
Haben meine Aufmerksamkeit erregt.
Wollte wissen: "Was tun die da?" "Wie geht das?" "Wie kann ich dieses Feature nutzen?"
Muss zugeben, dass ich mich schon ein paar Wochen damit beschäftigt habe....
Ok, recht lose, aber immer wieder.
Bücher, Sprachdefinition/Doku, Beispiele und viel viel üben.
Daher auch dieses qsort() Beispiel, in meiner Wühlkiste.
michael_x:
Interessant erscheint mir, dass "zweidimensionales Array" praktisch immer ein Designfehler (unglücklicher Denkansatz) ist und eigentlich ein eindimensionales Array eines entsprechend komplexeren Datentyps vorliegt.
Ja, das sieht man immer wieder und war auch hier sofort offensichtlich. Irgendwie scheint ein Array oft die einzige bekannte Datenstruktur zu sein. Und dann wird das für Dinge missbraucht die gar nicht gleich sind. Das finde ich etwas seltsam, da es Strukturen in irgendeiner Form schon ewig gibt. In anderen Sprachen auch, z.B. als Record