Größe eines Datentyps dynamisch zur Laufzeit erkennen?
-
Hallo,
gibt es in C++ denn eine Möglichkeit, während der Laufzeit die Größe eines Datentypes zu ermitteln? sizeof() ist ja statisch, aber ich bräuchte es dynamisch. Danke für Antworten!
-
datentypen sind bereits zur compile-zeit bekannt
-
Ja, die Datentypen des eigenen Programmes. Ich brauche es aber dynamisch! Wenn ich z.B. mein Programm unter einem 32 Bit System kompiliere, kann ich mit den Datentypen nicht genauso arbeiten wie unter einem 64 Bit System. Deshalb muss ich zur Laufzeit ermitteln können, wie groß der jeweilige Datentyp ist, um so speziell darauf reagieren zu können.
-
32 bit oder 64 bit ist auch zur compilezeit bekannt ....
-
Oh Gott, ist das pure Ignoranz, oder versteht ihr denn wirklich nicht, was ich meine? Es ist mir scheißegal, ob was zur Compilezeit bekannt ist, denn die Antwort hätte ich mir auch selber geben können! Schluss jetzt damit, was zur compilezeit bekannt ist. Ich suche nach einer Möglichkeit, die Größe eines Datentypen zur Laufzeit zu ermitteln.
-
Wenn es zur Compilezeit bekannt ist, bastelst du dir halt irgendein #define oder was weß ich, was dir eine bool variable mit true oder false definiert, die du dann per Laufzeit mit einer if-Abfrage abfragst

-
Poste doch einfach garnichts, wenn du davon eh keine Ahnung hast. Kommen jetzt noch ernstgemeinte Antworten, oder ist der Thread schon tot?
-
Die Frage ist einfach schlecht gestellt. Die Größe eines Objekts ist zum Compilezeitpunkt bekannt. Der Rest ist eigentlich nur noch eine Frage des Designs, wo gibt es dabei ein Problem?
-
eigentlich ist doch definiert das alle datentypen immer die gleiche anzahl an bytes haben (außer int), egal auf welchem system.
-
Nein, es sind nur Mindestgrößen und Verhältnisse definiert.
Um auf die Frage zurückzukommen: Es mag wohl sein, dass sich niemand konkret vorstellen kann, was Du möchtest. Deine bisherigen Erläuterungen haben dabei auch nicht sehr geholfen (da z.B. ein mit 32-bit kompiliertes Programm immer gleiche Typgrößen hat, auch wenn es auf einem x64-Prozessor läuft, und für native 64-bit muss neu kompiliert werden, wo sizeof() wieder die neuen Größen bereits zur Compilezeit ermittelt). Vielleicht machst Du einfach mal ein Stück Pseudocode, an dem wir sehen was Du vorhast.
-
LordJaxom schrieb:
Nein, es sind nur Mindestgrößen und Verhältnisse definiert.
Echt? Ich dachte das z.B. char immer ein byte ist
-
Tja, falsch gedenkt...
ein char kann auch aus mehr als 1 Byte bestehen, aber sizeof(char) liefert trotzdem immer 1.
Und so kann es z.B. sein, daß auch sizeof(int)=1 ist.
-
warum behauptet dann die leute immer c++ sei portabel? da könnte ich jetzt irgendwo ein programm für unicode schreiben wo char = 2 Byte und dann geht es auf anderen rechner doch nicht...

-
Scheint doch so, als würde es die Mehrheit verstehen, was ich meine, siehe Post vor mir. Okay, ein Beispiel:
Angenommen, ich speichere auf einem 32 Bit System einen POD in eine Datei ab, wobei jeder Datentyp des PODs (nehmen wir mal ints) zum Kompilierzeitpunkt 4 Byte betragen hat. Jedoch möchte der Anwender die auf einem 32 Bit System generierte Datenbank nun auf einem 64 Bit System einlesen, wo die Größe eines ints jedoch 8 Byte beträgt. Die sollte das Programm zur Laufzeit erkennen können, und dementsprechend reagieren. Wie es reagiert, kann an dieser Stelle piepegal sein. Relevant an meiner Frage ist lediglich, wie ich die Größe zur Laufzeit erkenne.
-
1. der beleidgende Tonfall bringt niemanden was.
2. Du brauchst natürlich die information, wie groß die daten in der datenbank sind. Die information wie groß die typen auf dem system sind auf dem das programm läuft, bekommst du eigentlich wirklich zur compilezeit, denn du musst das programm ja für 64bit neu compilieren, und dann funktioniert sizeof.
-
Man könnte fast meinen das ist ein Trollthread.
-
Die information wie groß die typen auf dem system sind auf dem das programm läuft, bekommst du eigentlich wirklich zur compilezeit, denn du musst das programm ja für 64bit neu compilieren, und dann funktioniert sizeof.
Okay, das ist ein Argument, ich muss dir Recht geben. Aber darf ich meine Frage nochmal stellen? Ich will zur Laufzet feststellen können, wie groß ein Datentyp ist. Wie mache ich das? Und bitte klammert euch nicht an irgendwelchen anderen Tatsachen fest, sondern beantwortet mir doch endlich meine Frage. Danke.
-
Du müsstest halt in der ersten Bytes der Datei das Encoding festlegen.
Oder du speicherst einfach nicht binär, sondern z.B. als XML ab.
-
Ich muss mir widersprechen. Es ist nicht zwingend notwenidg, ein auf einem 32 Bit System kompiliertes Programm neuzukompilieren, wenn es auf einem 64 Bit Sys laufen soll.
Du müsstest halt in der ersten Bytes der Datei das Encoding festlegen.
Das ist eine Idee. Bringt mir aber auch nichts, wenn das Programm nicht neukompiliert wird. Gibt es denn aber sonst keine alternative STL Methode, die mir die Größe zurückliefert? std::numeric_limits ist aber statisch, oder?
Oder du speicherst einfach nicht binär, sondern z.B. als XML ab.
geht nicht.
-
Wird ein 32-bit Programm auf einer 64-bit Maschine ausgeführt haben die Datentypen diesselbe Größe, wie auf einem 32-bit System. Schließlich sind ja auch auf einem 32-bit Windows die Integer in einem DOS-Programm 16-bit groß. Das wird einfach emuliert, oder irgendwie anders gelöst.
Wenn du dein Programm also in 32-bit kompilerst, sollte es auch die Datei korrekt lesen können, oder irre ich mich da?
In C++ gibt es aber soweit ich weiß kein Mittel zur Laufzeit die Größe eines Datentyps herauszufinden schließlich existieren zur Ausführung eh nur noch Nullen und Einsen. Eine Binäre-Datei besteht auch nur aus Bits; die Interpretation liegt bei dem Anwender. Du könntest ja immer nur einzelne Bytes einlesen und dir dann den Integer zusammenschiften, einfacher wäre aber - wie schon erwähnt - einfach nicht binär, sondern text-basiert zu arbeiten.Gruß
Don06
-
Wird ein 32-bit Programm auf einer 64-bit Maschine ausgeführt haben die Datentypen diesselbe Größe, wie auf einem 32-bit System. Schließlich sind ja auch auf einem 32-bit Windows die Integer in einem DOS-Programm 16-bit groß.
Nicht wenn man sie dynamisch anfordert. Und was ist, wenn ein auf 'nem 64 Bit System kompiliertes Programm eine auf einem 32 Bit System generierte Datenbank einliest? Crash.
Das wird einfach emuliert, oder irgendwie anders gelöst.
Das Schlagwort: "irgendwie". Und das "irgendwie anders lösen" muss schon der Programmierer. In dem Fall ich.
Wenn du dein Programm also in 32-bit kompilerst, sollte es auch die Datei korrekt lesen können, oder irre ich mich da?
Du irrst dich. Siehe oben.
In C++ gibt es aber soweit ich weiß kein Mittel zur Laufzeit die Größe eines Datentyps herauszufinden schließlich existieren zur Ausführung eh nur noch Nullen und Einsen.
Soweit du weist, ja... Muss aber nicht so sein, deshalb habe ich diesen Thread hier eröffnet.
Eine Binäre-Datei besteht auch nur aus Bits; die Interpretation liegt bei dem Anwender.
Gut erkannt, die Interpretation liegt beim Anwender.
Du könntest ja immer nur einzelne Bytes einlesen und dir dann den Integer zusammenschiften,
Tatsache! Aber dazu muss man wissen, wie groß der Datentyp auf dem Hostsystem ist!

einfacher wäre aber - wie schon erwähnt - einfach nicht binär, sondern text-basiert zu arbeiten.
Unter Berücksichtigung dieser Tatsache vielleicht schon. Man kann aber nicht alle Daten einfach textbasiert in die Datei speichert, schließlich handelt es sich mit den Datentypen nur um ein Beispiel. Es gibt auch komplexe binäre Strukturen, die man eben nicht als Text abspeichern kann. Und genau da scheitert die Idee mit dem XML Script.