mehrdimensinale Arrays mit verschiedenen Datentypen je dim
-
BorisDieKlinge schrieb:
vll. irre ich mich auch

Ja, du irrst dich - C++ legt Mindestgrößen für die Typen fest, aber keine exakten Größen (und BOOL ist nichtmal im Standard enthalten).
-
Wenn für jede Dimension ein anderer Datentyp gebraucht wird, kann man natürlich auch union nehmen. Mir fällt zwar keine sinnvolle Verwendung gerade ein aber dann braucht man immerhin weniger Platz als mit einem struct und hat auch noch eine mögliche Fehlerquelle mehr.

-
Hab' das Problem nun doch mit Struct, bzw habe ich eine Klasse defieniert, gelöst.
Manchmal sieht man die Lösung vor der Nase nicht

Vielen Dank für eure Antworten!

greetz johnc
-
Nochmal:
unsigned char sArray[100][12]; ((int*)&sArray[4])[0]= 4; ((float*)&sArray[4])[1]= 0.3434; ((BOOL*)&sArray[4])[2]= true;hier gibt es ein undefinierts verhalten...
woran leigt das genau?
Wie sieht es wenn ich sowas in ANSI C machen?
-
Hat CStoll doch schon gesagt. Der Standard legt keine exakten Größen für die Typen fest (nur Mindestgrößen). Also kann float durchaus größer als unsigned char sein.
BOOL ist, wie gesagt, gar nicht Teil des Standards. Da steht die Größe also auch nicht fest.
-
BorisDieKlinge schrieb:
Nochmal:...
Die Lösung wurde schon angegeben, nur noch zum BOOL und deiner Lösung an sich noch etwas.
- "BOOL" wird z.B. in der WinAPI definiert, und dieses Define stammt aus einer Zeit bevor es "bool" in den Standard geschafft hat. Grundsätzlich kannst du davon ausgehen das alle großgeschriebenen Bezeicher nicht im Standard enthalten sind. Und der Typ "bool" ist auf einen normalen System IMHO kleiner als 32 bit.
- C-Sytle Casts sollten in C++ nicht verwendet werden.
- Warum musst du eigentlich unsaubere Lösungen posten wenn saubere bereits genannt wurden? (Nichts für ungut, aber wenn ich einen Post mit deinen Namen sehe graust es mich zumeist schon vor dem Lesen, da du sehr häufig unsaubere Programmierung weitergibst).
cu André
-
ich hab hier die saubere und unsaubere version gepostet:)
Ja hackt auf mir rum, nur weil ich helfen will.... tzzz

-
BorisDieKlinge schrieb:
ich hab hier die saubere und unsaubere version gepostet:)
Okay, übersehen.
ABER: Warum zur Hölle noch die Unsaubere nachschieben? Muss das wirklich sein?cu André
-
ne musste nich sein...ich bin grad bischen am C coden, und da extrahiere ich werte mit best. typen aus rohdaten bytes... da kamm mir das in sinn..
deswegen auch meine darauf folgende Frage ob die länge von datentypen in ANSI C fest sind?? Ob es da zu keinem undefinierten verhalten kommt?
-
BorisDieKlinge schrieb:
deswegen auch meine darauf folgende Frage ob die länge von datentypen in ANSI C fest sind??
Nein, die Länge von Datentypen in ANSI C und ANSI C++ ist nicht festgelegt. Das einzige was zu den Längen festgeschrieben ist, wie die Größe der unterschiedlichen Datentypes zueinander ist.
Meist ist das in einer Form wie dieser angegeben: char <= int <= long
Wie du daraus schon Ablesen kannst ist auch diese Größenuntergliederung nicht unbedingt wirklich aussagekräftig. In der Regel kann man davon ausgehen das int unter 32 Bit Umgebungen auch 32 Bit groß ist, und unter 64 Bit Umgebungen eben 64 Bit. Aber soviel ich weiß ist selbst das nicht zwingend festgeschrieben.
cu André
-
hmm ok..
würde ich jetzt :
#pragma pack(1) struct test{ int A; float B; char C; } test; #pragma pop()machen.
würde nund bei sizeof(test); bei winXP, win 3.11 und Vista unterschiedliche länge nraus kommen?
-
BorisDieKlinge schrieb:
würde nund bei sizeof(test); bei winXP, win 3.11 und Vista unterschiedliche länge nraus kommen?
Es könnten auch unterschiedliche Längen bei MSVC, gcc und Borland rauskommen...
-
hmm , und wie geht ich mit folgender problematik um?
Ich lese Roh daten von einer SPS... die SPS hat ja feste Datentyp längen
REAL 32bit
char 8bit
WORD 16bit
DWORD 32Bitetc.
nun spiegel ich einen best speicehr bereich der SPS als Byte sequenz..
welche ich ja jetzt in ein struct spiegeln kann. Da aber nie sicher gegeben ist das die längen eindeutig lang sind, könnte das ja auf unterschiedlichen OS probleme geben odeR?
-
Ja, könnte es. Aber die systemspezifischen Typen wie WORD oder REAL werden idR so definiert, daß die Größe exakt stimmt (zumindest bei den Compilern, die sie anbieten). D.h. wenn der Compiler WORD versteht, steckt dahinter ein 2 Byte großer Ganzzahltyp.
PS: "char" ist der einzige Datentyp, bei dem der Standard die Größe auf 1 Byte festlegt - ABER er erlaubt den Compilern immer noch, Bytes mit mehr als 8 Bit zu definieren.
-
Normalerweise bietet jeder Compiler spezielle Typedefs oder Schlüsselwörter um Typen fester Größe anzugeben.
Beim MSVC kannst du __int8, __int16, __int32, __int64 benutzen und wenn du es portabel haben willst, dann bietet dir z.B. boost einheitliche typedefs.
Wobei du das auch leicht selbst hinbekommen kannst mit Hilfe von configure.
-
Es gibt auch im Standard Typen mit fester Größe (int32_t, uint16_t ...) - jedoch sind die meisten davon leider optional.