JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=63bb8124c347a56bf2fe2bbee922c174Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Datentypen
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 21.04.2006, 19:58    Titel: Datentypen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 21.04.2006, 20:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 21.04.2006, 20:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 21.04.2006, 20:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 21.04.2006, 21:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 22.04.2006, 01:17    Titel: Antworten mit Zitat

Steht sogar in der MSDN, dass die Größe vom OS abhängt Wink

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 21.11.2006, 22:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 22.11.2006, 07:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 22.11.2006, 07:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 22.11.2006, 12:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 22.11.2006, 13:01    Titel: Antworten mit Zitat

Einfach casten.

grüße
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 02.12.2006, 15:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 02.12.2006, 18:50    Titel: Antworten mit Zitat

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 Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 02.12.2006, 19:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 03.12.2006, 15:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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

Impressum