010
21.12.2007, 02:41 Uhr
Pablo
Supertux (Operator)
|
Zitat von ao: |
[quote Pablo] 8-fach geschachtelt, sagst du? Also wenn alle 8 Datentypen mit gleicher Häufigkeit vorkommen, darfst du im statistischen Mittel damit rechnen, dass Vergleich und Verzweigung jeweils 4,5-mal angewendet werden müssen, bis du an der richtigen Stelle gelandet bist. Ich wage zu behaupten, dass ein switch-clause performanter wäre.
|
Um ehrlich zu sein, gefällt mir die Lösung ganz und gar nicht (könnte damit meinen Code für den obfuscated code contest vorbereiten ), aber ich hab keine bessere Lösung gefunden. Das Problem ist, dass 'data' ein union der Form ist:
C++: |
union { int8_t i8; uint8_t u8; int16_t i16; uint16_t u16; ... double d; }
|
Die 'sensor' Struktur ist eine "abstrakte Klasse" (das ist eine C Bib) von (nach eigenem Schema) selbst geschriebenen device drivers unterschiedlicher Arten von Sensoren (vor allem CanOpen Geräten und andere Analog Geräten). Diese Sensor Abstraktion hat eine Funktion get_value, die nichts anders ist als ein Wrapper der get_value Funktion der verschiedenen Treiber. Das Problem ist, dass jeder Treiber unterschiedliche Datentypen, so liefern manche Sensoren uint16_t Werte und manche sogar doubles. Deswegen kam ich auf die Idee mit dem Union, so dass je nach Typ des Sensors eins der Felder des Union benutzt, um die Werte des Sensors zu speichern.
Die Idee ist folgende:
C++: |
can_device *poti = create_can_device(<params>); /* uint32_t Werte*/ analog_device *pt100 = create_analog_device(<params>); /* double Werte */ ... sensor *s1 = poti->get_abstract_sensor(); sensor *s2 = pt100->get_abstract_sensor(); ... uint32_t val1; double val2;
val1 = sensor_get_value(val1); val2 = sensor_get_value(val2); ...
|
Deswegen kann ich nicht eine sensor_get_value Funktion schreiben, weil die Rückgabe nicht bekannt ist, sondern erst zur Laufzeit bestimmt ist, deswegen ja mein Marko. Außerdem wollen wir nach der Initialisierung nur mit den abstrakten sensor Objekten arbeiten, von denen wir nur wissen (wollen), was für einen Datentyp sie liefern und was das für einen Sensor ursprünglich war. -- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! Dieser Post wurde am 21.12.2007 um 02:50 Uhr von Pablo editiert. |