|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 21.04.2006, 19:58 Titel: Datentypen |
|
|
Wieso benutzt man DWORD statt unsigned long?
bzw. ist unsigned long nicht das selbe wie unsigned int? Wofür ist dann long da?
int kann ja je nach Compiler unterschiedlich gorß sein, ja? Können dadurch long und int unterschiedliche Größen haben? Weil long wird zumindest bei mir blau dargestellt im Gegensatz zu DWORD oder anderen typedefs. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 21.04.2006, 20:13 Titel: |
|
|
DWORD ist einfach nur eine Definition von Microsoft die zum einen klar machen soll um welche Art von Daten es sich handelt und zum anderen spart es eine Menge Schreibarbeit.
Es ist nichts anderes als
typedef unsigned long DWORD;
Nach Patricks Aussage ist int nicht immer 4 byte lang, long ist es jedoch.
Gruesse |
|
Nach oben |
|
|
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 21.04.2006, 20:27 Titel: |
|
|
BYTE, WORD und DWORD kommen ursprünglich aus Assembler und sind keine Erfindung von MS _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 21.04.2006, 20:42 Titel: |
|
|
AFE hat mir erzählt, int wäre immer 4 Byte und long könnte auf 64 bit Compilern dann halt 8 Bit oder so haben, sattt 32. WAs den nu? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 21.04.2006, 21:00 Titel: |
|
|
Schau mal in die <limits.h> dort stehen die grössen als DEFINES, wobei diese nicht allgemein gültig sind, allgemein gültig scheint nur folgende Aussage zu sein:
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
Müsste in irgendeiner ISO stehen. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 22.04.2006, 01:17 Titel: |
|
|
Steht sogar in der MSDN, dass die Größe vom OS abhängt
Die MSDN hat Folgendes geschrieben: | The size of a signed or unsigned int item is the standard size of an integer on a particular machine. For example, in 16-bit operating systems, the int type is usually 16 bits, or 2 bytes. In 32-bit operating systems, the int type is usually 32 bits, or 4 bytes. Thus, the int type is equivalent to either the short int or the long int type, and the unsigned int type is equivalent to either the unsigned short or the unsigned long type, depending on the target environment. The int types all represent signed values unless specified otherwise. |
Wenn du in der MSDN "fundamental types" eingibst, bekommst du noch mal das bestätigt, was Fallen gesagt hat.
Wenn du wirklich sicher sein willst, dass deine Integer zu jeder Zeit die gleiche Größe haben, musst du streng genommen __int32 oder __int64 nehmen (mit 8 und 16 gehts natürlich auch). _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 21.11.2006, 22:03 Titel: |
|
|
Ich hab da auch mal ne Frage, die eingentlich in gewisser Weise zu dem Thema passt.
Hat irgend einer ne Ahnung wie man am schnellsten eine Variable z.B. ein float , das ja 4 Bytes braucht in ein char[4] (braucht doch jeweils 1 Byte, oder) schreibt und umgekehrt ? |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 22.11.2006, 07:17 Titel: |
|
|
CPP: | union {
char[4] CharArray;
float Float;
} MeineVariable;
MeineVariable.Float=12.345f;
FunktionWelcheEin4ByteCharArrayBenutzt(MeineVariable.CharArray);
|
_________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 22.11.2006, 07:23 Titel: |
|
|
Hi!
Zu den Datentypen:
Der sizeof() Operator liefert die Größe eines Datentypen in Byte. Ein Byte ist aber nicht Equivalent zu acht Bit sondern muss lediglich alle Zeichen des Ausführzeichensatzes aufnehmen können. Es gibt Plattformen mit 9, 16 oder sogar 32 Bit pro Byte, das ist ganz beliebig.
Will man nun herausfinden wieviel Bits ein Byte hat, kann ja durchaus gewünscht sein, so kann man das in der Datei limits.h nachsehen, da gibts eine Definition mit Namen CHAR_BIT.
Ein Byte muss weiterhin Addressierbar sein und aus einer Reihe aufeinanderfolgenden Bits bestehen.
[char]
Der Datentyp char entspricht IMMER einem Byte, sizeof( char ) liefert also immer eins zurück. Außerdem gibt es die Versionen signed char und unsigned char, wobei signed mit Vorzeichenbehaftet und unsigned nicht Vorzeichenbehaftet ist. Ob char signed oder unsigned ist, ist ebenfalls nicht festgelegt. Es kann also eines von beiden sein.
UCHAR_MAX liefert den Maximalwert eines unsigned chars, dieser ist mindestens 255 also 2^8-1, die mindestgröße eines Bytes (also auch char) ist also acht Bit.
[short]
Der Datentyp short ist festgelegt auf mindestens 16 Bit. Auch hier gibt es zwei Varianten, signed short und unsigned short. Short, signed short und unsigned short sind egtl Synonyme für short int, signed short int und unsigned short int.
Short ist automatisch signed.
[int]
Int muss mindestens so groß sein wie short, kann also 16 Bit Breit sein. Der Rest ist auch equivalent zu short. Int kann aber auch größer als short sein.
[long]
Long muss mindestens 32 Bit halten können, kann aber auch gleich groß wie int sein, wenn int >= 32 Bit ist, kann aber auch größer sein. Der Rest, s.o.
[long long]
Long long muss mindestens so groß sein wie long, kann aber auch größer sein. Rest s.o.
[wchar_t]
Der Datentyp wchar_t muss groß genug sein um alle Zeichen des "größten" unterstützten Zeichensatzes aufnehmen zu können. D.h. wchar_t ist mindestens so groß wie char und maximal so groß wie long. Es gibt explizit kein signed oder unsigned wchar_t. Der Datentyp ist implizit signed oder unsigned je nachdem welcher integer Typ ihm untergeordnet ist.
[bool]
Bool nimmt die Werte true und false auf. Unsigned und signed bool gibt es nicht.
[Gleitkommatypen]
Es gibt folgende Gleitkommatypen: float, double, long double. Jeder Typ kann (gelesen von links nach rechts) alle Werte des vorherigen aufnehmen. Die Wertrepräsentation ist komplett Implementierungsabhängig!
[BYTE, WORD, DWORD]
Sind Definitionen aus der WinAPI. BYTE = unsigned char, WORD = unsigned short und DWORD = unsigned long.
[__int32, __int64]
Diese Datentypen sind Microsoft spezifisch, sollten also nicht unbedingt, oder nur mit Alternativen, verwendet werden.
grüße |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 22.11.2006, 12:58 Titel: |
|
|
Danke für die schnelle Antwort.
Das das so einfach ist hät ich nicht gedacht. Ich dachte immer man müsste da die einzellnen Bytes von einem float auslesen und das dann in ein char packen. Gibt es da solche Funktionen mit denen das ginge ?
Rein aus Interesse. |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 22.11.2006, 13:01 Titel: |
|
|
Einfach casten.
grüße |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 02.12.2006, 15:30 Titel: |
|
|
Ich hab das mit dem union jetzt schon oft bei mir eingebunden, doch eines kann ich mir nicht erklären:
Weiß jemand warum man eine D3DXVECTOR3-Strucktur nicht in eine union packen kann ?
CPP: | union {
D3DXVECTOR3 position;
char CharField[sizeof(D3DXVECTOR3)];
}test; |
da motzt der Compiler immer. Darum bin ich das Problem umgangen und hab mir eine eigene VECTOR3-Strucktur geschrieben, mit der das ging. Allerdings kann man die nicht direct in eine Funktion , die ein
D3DXVECTOR3- Argument verlangt einsetzen, was diese Methode sehr unelegant macht. Also :
CPP: | struct VECTOR3{
float x, y, z;
};
union {
VECTOR3 position;
char CharField[sizeof(VECTOR3)];
}test; |
Wie löst ihr solche lässtigen Probleme ? |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 02.12.2006, 18:50 Titel: |
|
|
Otscho hat Folgendes geschrieben: | Wie löst ihr solche lässtigen Probleme ? |
Es würde schon helfen, wenn du uns die genaue Fehlermeldung des Compilers mitteilst _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 02.12.2006, 19:35 Titel: |
|
|
Vergessen die entsprechende Datei einzubinden?
Ich bin mir sicher sowas schon mal gemacht zu haben, allerdings mit einer D3DMatrix, also nix mit X. Vielleicht weil D3DXVector3 selber eine Klasse ist?
=>Fehlermeldung zeigen ! _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 03.12.2006, 15:39 Titel: |
|
|
ansonsten kannst du deine jetzige Methode auh verwenden, das "Unelegante" könntest du folgendermaßen umgehen:
CPP: | struct VECTOR3
{
float x, y, z;
// implizites Casten
operator D3DXVECTOR3 ()
{
return D3DXVECTOR3(x, y, z);
}
}; |
Das ermöglicht dir, mit deiner Vector-Struktur wie mit einem D3DXVECTOR3 umzugehen, bsp: CPP: | // test ist ein Objekt von deiner Union, foo() sei eine Methode, die ein
// D3DXVECTOR3-Objekt als Argument erwartet:
foo(test.position) // entspricht: D3DXVECTOR3(test.position.x,
// test.position.y, test.position.z) |
Falls du aber wirklich deine Struktur benutzen willst, musst du sie um extra Funktionen für Vektoren erweitern, wie z.B. operator+ , eine Funktion fürs Skalarprodukt usw.usf.
Gruß DXer |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|