ein integer in zwei short teilen
-
prinzipiell ist das ja machbar,
aber hast du dir mal überlegt, was passiert, wenn da mal statt 92 ein 9F steht oder so?
wie willst du das dann einfach mal als Dezimalzahl werten?
-
Was du von
getDLLVersion( )bekommst, sind einen Haufen bits. Nicht mehr und nicht weniger. Nachdem du denintin zweiunsigned shorts aufgeteilt hast, hast du wieder einen Haufen bits. Wie Du die interpretierst, ist eine andere Geschichte.Ist die DLL von Dir, oder bist du "nur" Benutzer? Wenn der Entwickler der DLL vorgibt, dass die Versionsnummern Hexadezimal zu verstehen sind, dann gib sie Hexadezimal aus und alles ist gut.
greetz, Swordfish
-
Eine Möglichkeit wäre auch noch ein Bitset:
struct dll_version_t { unsigned major : 16; unsigned minor : 16; }; dll_version_t version = *reinterpret_cast<dll_version_t*> (getDLLVersion ());
-
Verdammt, ich bin immer noch viel zu C-lastig. *kopfgegentischplatteknallt*

greetz, Swordfish
-
wenn es sowieso/nur für windows ist, gibts zu diesem zweck die wunderschönen makros LOWORD und HIWORD.
-
winner schrieb:
[...] wunderschönen makros LOWORD und HIWORD.
contradictio in adiecto

greetz, Swordfish
-
Swordfish schrieb:
contradictio in adiecto

genau, ich wollte ja noch "oxymoron" als user hinschreiben

-
am einfachsten wäre es mit einem short pointer.
short getUpper( long value ) { short * ptr = (short*) &value; ++ptr; return *ptr; } short getLower( long value ) { short * ptr = (short*) &value; return *ptr; }
-
plongor schrieb:
am einfachsten wäre es mit einem short pointer.
Wohl eher am unsichersten. Was, wenn ein
short4 Bytes breit ist?greetz, Swordfish
-
Gegenfrage, was ist wenn der Integer 33 Byte groß ist und gar nicht durch 2 teilbar ist?
-
Sch***egal, denn:
gerritgoetzen schrieb:
Laut Dokumentation stehen in den "höherwertigen 16 Bit die Hauptversion" und und in den anderen 16 Bit die Unterversion.
greetz, Swordfish
-
Ich meine eine Union wäre eine gute Lösung
union { unsigned int alles; unsigned short hälfte[2]; };
-
Ich meine eine Union wäre eine gute Lösung
union { unsigned int alles; unsigned short hälfte[2]; };
-
c++-er schrieb:
Ich meine eine Union wäre eine gute Lösung
Ist es aber nicht :p
-
plongor schrieb:
am einfachsten wäre es mit einem short pointer.
short getUpper( long value ) { short * ptr = (short*) &value; ++ptr; return *ptr; } short getLower( long value ) { short * ptr = (short*) &value; return *ptr; }undefiniert
c++-er schrieb:
Ich meine eine Union wäre eine gute Lösung
union { unsigned int alles; unsigned short hälfte[2]; };ebenfalls undefiniert
Natürlich muss die Repräsentation beider Typen entsprechend zueinander passen (also short: 16bit ohne padding, int: 32bit ohne Padding) - aber beide Verfahren (die auf das Gleiche hinauslaufen) haben dennoch aus dem gleichen Grunde (3.10/15) undefiniertes Verhalten.
-
Könnte mal jemand einen FAQ Beitrag dazu schreiben warum das undefiniert ist? Ich sehe das nämlich ziemlich oft das eine Union für sowas missbraucht wird.