Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

1

26.07.2006, 22:22

error_list

hallo leute!

ich mach nach wie vor das tutorial für bomberman auf germangamedev.de!

also... ich hab mich gefragt warum derjenige der das tut geschrieben hat soviele #defines verwendet für error codes

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    // SPIELFELD

#define FIELD_STATUS_FREE               0x0
#define FIELD_STATUS_DESTROYABLE        0x1
#define FIELD_STATUS_FIXED              0x2
#define FIELD_STATUS_DESTROYED          0x4
#define FIELD_SIZE                      51
    
    // ERRORS

#define ERROR_INVALID_GAMEFIELD_SIZE                1
#define ERROR_OUT_OF_MEMORY                         2
#define ERROR_UNABLE_TO_RETRIEVE_DC                 4
#define ERROR_UNABLE_TO_CREATE_COMPATIBLE_DC        5
#define ERROR_UNABLE_TO_CREATE_COMPATIBLE_BITMAP    6
#define ERROR_UNABLE_TO_SELECT_BACKBUFFER_BITMAP    7
#define ERROR_UNABLE_TO_DELETE_BACKBUFFER_BITMAP    8
#define ERROR_UNABLE_TO_DELETE_BACKBUFFER_DC        9


das sind 13 defines ... also 52 bytes! (4 bytes/#define wenn ich richig liege nicht?

jetz frag ich mich .. warum verwendet er dafür nicht den typ unsigned _int8 (0-255) oder char ? das reicht ja völlig aus und spart speicher.. oder liege ich da falsch? (_int8 laut sizeof = 1 byte)

nun ja.. zusätzlich hab ich mir gedacht, dass das genze eventuell schöner aussehen würde, wenn ich das in ein struct schreibe... dann hab ich so ne art liste für meine errors.. das wiederum hat nicht so ganz geklappt

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef struct _error_list
{
        // SPIELFELD

unsigned _int8  FIELD_STATUS_FREE               = 0x0;
unsigned _int8  FIELD_STATUS_DESTROYABLE        = 0x1;
unsigned _int8  FIELD_STATUS_FIXED              = 0x2;
unsigned _int8  FIELD_STATUS_DESTROYED          = 0x4;
unsigned _int8  FIELD_SIZE                      = 51;
    
    // ERRORS

unsigned _int8  ERROR_INVALID_GAMEFIELD_SIZE                = 1;
unsigned _int8  ERROR_OUT_OF_MEMORY                         = 2;
unsigned _int8  ERROR_UNABLE_TO_RETRIEVE_DC                 = 4;
unsigned _int8  ERROR_UNABLE_TO_CREATE_COMPATIBLE_DC        = 5;
unsigned _int8  ERROR_UNABLE_TO_CREATE_COMPATIBLE_BITMAP    = 6;
unsigned _int8  ERROR_UNABLE_TO_SELECT_BACKBUFFER_BITMAP    = 7;
unsigned _int8  ERROR_UNABLE_TO_DELETE_BACKBUFFER_BITMAP    = 8;
unsigned _int8  ERROR_UNABLE_TO_DELETE_BACKBUFFER_DC        = 9;
}ERROR_LIST;


da kommen so 1000 fehler ^^ (die will ich erst gar nicht posten)

weiß jemand ob meine 'idee' gar nicht so schlecht ist? also... spare ich dadurch speicher? und mache ich den code eher komplizierter oder übersichtlicher? :roll:
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

2

26.07.2006, 22:34

1.) Bei einem define brauchst du keinen Speicher, da es VOR dem eigentlichen Compilieren mit dem Namen des Makros ersetzt wird, durch den Ausdruck/Zahl/Konstande.

2.) 4Byte deswegen, da int. Int ist normalerweise 32bit, also 32/8 = 4 Byte. Rechner können mit diesen 32Bit zahlen genauso schnell rechnen wie mit kleineren.

3.) wenn dann benutzt man für sowas const & enums

4.) Wenn ich das richtig sehe hast du oben 5+8 = 13 defines. Da dies alles int's sind, beträgt der Speicherplatz 4Byte * 13 = 52Byte.

5.) Problem kann oben werden, wenn das define als signed int interpretiert wird, und die Konstande >= 2^31 wird. Ist also beihnahe ausgeschlossen, ausser man operiert mit Hexa Zahlen.

6.) int8 = 8Bit = 1Byte korrekt

Vorschlag:

C-/C++-Quelltext

1
2
3
4
5
enum error
{
FIELD_STATUS_FREE = 0,
FIELD_STATUS_DESTROYABLE = 4
};


oder

C-/C++-Quelltext

1
const unsigned __int32 FIELD_STATUS_DESTROYABLE = 4


Bei Kritik, Lob, Anerkennung, Frustration, Angst... bitte mitteilen.

Anonymous

unregistriert

3

26.07.2006, 22:49

Koschka
Die 2 ist falsch was Du über int sagst.

Int ist ein in der Mindestgröße wie folgt definierter Datentyp:

>= short && <= long

Int kann auch 16 bit sein, war er früher oft. Dazu Rechnet Windows nur in 4 Byte intervallen. Daher sollte man auch Unicode benutzen, da ANSI zu lam ist. Windows ist eigentlich relativ raffiniert: Gibst im einen char, er macht daraus intern einen 4 Byte Datentyp um SIMDs benutzen zu können. Daher auch das interessante an Windows: Fast alles erwartet einen unsigned long ;)

daher:

C-/C++-Quelltext

1
2
const unsigned long okay  = 0x00000000L;
const unsigned long error = 0x00000001L; 

unsigned long einfach das Beste ;)

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

4

26.07.2006, 22:57

*berichtigung zu 2.)

ja Patrick hat schon Recht, ich meinte im Compiler (speziell der VCExpress) ist int normalerweise 4Byte groß. Aber: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_langref_data_type_ranges.asp

und Rechner können mit 32Bit zahlen schneller rechnen als mit int8 Zahlen und Rechenzeit ist kostbarer als speicher.

T-VIRUS

Alter Hase

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

5

27.07.2006, 07:38

Mal ne Frage was genau ist Unicode und was ist Ansi?
Ich hab damit noch verständniss Probleme :(

Edit1

Hm okay habs herrausgefunden jetzt weiß ich nur nicht wie ich Unicode für meine Tastatur nutzen kann und ich hab auch noch keinen Durchblick über die ganzen Sätze :(

Edit2
Okay habs :p nur wie kann ich Unicode in meinem Game einstellen?
Gibts da irgend wo einen Schalter?
Brauche ich eine Header/Lib/dll dafür?
Oder wie?
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

6

27.07.2006, 08:18

Unicode der Zeichen codiert. Der Datenraum ist meistens heut noch 16Bit. Also UCS-2, 2Byte => 16Bit. Die neuen Standards umfassen aber 32Bit, also UCS 4. Die meisten Seiten im Internet arbeiten schon ewig zumindest mit UCS2.

In diesem Code werden alle Zeichen codiert die internsational irgendwie wichtig sind. Als vom Euro Zeichen, das logische nicht bis zum chinesisch. Derzeit sind lt. wiki ca. 96000 Zeichen codiert.

Ansi ist ebenso ein solcher Code. Der Datenraum umfasst jedoch "nur" lediglich 255 Zeichen. Dieser Code enthällt erstmals auch ö, ä, ü.
Ansi ist genauso wie Unicode eine Obermenge vom ASCII.

Wenn man mit Unicode arbeiten will braucht man wchar_t. wchar_t ist größer als char, da wchar_t entweder eine 16Bit Variable ist (heut noch) oder 32Bit. Das hat auch was mit dem neuen Code s.o. zu tun. Und 32 Bit lassen sich meist schneller verarbeiten.

um Unicode zu verwenden muss man nur ein #define UNICODE vor das #include<windows.h> setzen, bzw. Unicode Strings (basic_string<wchar_t>) oder wchar_t benutzen.


Da du den Petzold aber hast, könntest du ja einfach mal nachlesen ^^

T-VIRUS

Alter Hase

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

7

27.07.2006, 08:59

He danke Koschka :)
Werd in Zukunft mehr mit wchar_t arbeiten ;)
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

8

27.07.2006, 17:30

heißt das jetz dass diese lösung hier

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    // SPIELFELD 

#define    FIELD_STATUS_FREE                0x0 
#define    FIELD_STATUS_DESTROYABLE        0x1 
#define    FIELD_STATUS_FIXED                0x2 
#define    FIELD_STATUS_DESTROYED            0x4 
#define FIELD_SIZE                        51 
    
    // ERRORS 

#define    ERROR_INVALID_GAMEFIELD_SIZE                1 
#define    ERROR_OUT_OF_MEMORY                            2 
#define    ERROR_UNABLE_TO_RETRIEVE_DC                    4 
#define    ERROR_UNABLE_TO_CREATE_COMPATIBLE_DC        5 
#define    ERROR_UNABLE_TO_CREATE_COMPATIBLE_BITMAP    6 
#define    ERROR_UNABLE_TO_SELECT_BACKBUFFER_BITMAP    7 
#define    ERROR_UNABLE_TO_DELETE_BACKBUFFER_BITMAP    8 
#define    ERROR_UNABLE_TO_DELETE_BACKBUFFER_DC        9

ok ist? oder würde jemand was anderes/schnelleres empfehlen?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

9

27.07.2006, 17:41

es steht doch alles oben, im 2. Thread.

Ok im Sinne von Funktionieren sicher
Ok im Sinne von "schön" iist Ansichtsache, ich würde enums / const nehmen.

Anonymous

unregistriert

10

27.07.2006, 21:53

$nooc
Biste n00b, benutzte #define.
Biste Pro, benutzte const

Werbeanzeige