 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Asto JLI'ler

Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 04.06.2007, 14:41 Titel: |
|
|
super es funktioniert
habe einfach die struktur umschlossen:
CPP: | #pragma pack(2)
struct ZipHeader
{
DWORD Signature;
WORD VersionNeeded;
WORD GeneralPurpose;
WORD CompressionMethod;
WORD LastModTime;
WORD LastModDate;
DWORD CRC32;
DWORD CompressedSize;
DWORD UncompressedSize;
WORD FilenameLength;
WORD ExtraLength;
};
#pragma pack() |
Hatte pack() selber ausprobiert, aber wollte net so, hatte noch pop und push drin
Vielen Dank für deine schnelle Hilfe! _________________ "A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt |
|
Nach oben |
|
 |
David Super JLI'ler
Alter: 40 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 04.06.2007, 16:01 Titel: |
|
|
Machs lieber so:
CPP: | #pragma pack( push, 1 )
struct ZipHeader
{
DWORD Signature;
WORD VersionNeeded;
WORD GeneralPurpose;
WORD CompressionMethod;
WORD LastModTime;
WORD LastModDate;
DWORD CRC32;
DWORD CompressedSize;
DWORD UncompressedSize;
WORD FilenameLength;
WORD ExtraLength;
};
#pragma pack( pop )
|
|
|
Nach oben |
|
 |
Asto JLI'ler

Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 04.06.2007, 16:13 Titel: |
|
|
hmm muss das dann eine 1 sein oder eine 2 bei "push, 1" ?
Was amcht dieses push und pop? Habs ind er Hilfe net verstanden :X _________________ "A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt |
|
Nach oben |
|
 |
David Super JLI'ler
Alter: 40 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 04.06.2007, 16:19 Titel: |
|
|
Du willst doch die "tatsächliche" Größe der Struktur oder? Also richtest du nach einem Byte aus. Das push und pop hilft nur dabei die letzte Speicherausrichtung auf den vorhergehenden Wert zurückzusetzen. Pack() ohne Argumente geht von einem memoryalignment von 8 Byte aus, nutzt du den Compilerstack so kannst du auf den von dir zuletzt gesetzten Wert zurücksetzen. |
|
Nach oben |
|
 |
KI JLI Master

Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
|
Nach oben |
|
 |
David Super JLI'ler
Alter: 40 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 04.06.2007, 16:35 Titel: |
|
|
Da isn Fehler im Beispiel:
CPP: | #pragma pack (1 , push)
struct foo
{
float x, y, z;
BYTE b;
};
#pragma pack (pop)
|
Sollte egtl sein:
CPP: | #pragma pack (push, 1)
struct foo
{
float x, y, z;
BYTE b;
};
#pragma pack (pop)
|
grüße |
|
Nach oben |
|
 |
Asto JLI'ler

Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 04.06.2007, 17:02 Titel: |
|
|
danke ihr 2  _________________ "A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt |
|
Nach oben |
|
 |
Otscho Super JLI'ler

Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 02.07.2007, 16:25 Titel: |
|
|
Ich hätt da auch noch ne Frage:
Wie kann man die Funktion vom tut für unicode umschreiben ?
Oder wie kann man von wchar in char umwandeln ? |
|
Nach oben |
|
 |
Asto JLI'ler

Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 02.07.2007, 23:21 Titel: |
|
|
Hmm ich weiss zwar nicht genau was du vor hast, aber evt. hilft dir folgendes:
http://www.codeguru.com/forum/showthread.php?t=336106 (Englisch)
Wo is der Vorteil bei der Verwendung von Unicode vs. MultiByte? _________________ "A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 06.07.2007, 16:01 Titel: |
|
|
ein moderner Weg, wchar und char gegenseitig korrekt(das obere Bsp. ist nämlich unvollständig) zu casten, ist die Verwendung eines char_casts. Den kann man sich selber schreiben und anpassen, je nachdem für C oder C++. IIRC hat GreveN oder david hier mal einen schönen char_cast geschrieben, den du per Forensuche finden kannst. Ich habe diesen Cast übr. etwas umgeschrieben, meine Version sieht flogendermaßen aus:
CPP: | #pragma warning( disable : 4996 )
// general template, will be specialized for the two common string/char types
template<typename T_Dest, typename T_Src> inline const T_Dest char_cast( const T_Src& aSrc, const std::locale& aLoc = std::locale::classic() );
// string to string, do nothing
template<> inline const std::basic_string<char> char_cast( const std::basic_string<char>& aSrc, const std::locale& aLoc )
{
return aSrc;
}
// wstring to wstring, do nothing
template<> inline const std::basic_string<wchar_t> char_cast( const std::basic_string<wchar_t>& aSrc, const std::locale& aLoc )
{
return aSrc;
}
// string to wstring
template<> inline const std::basic_string<wchar_t> char_cast( const std::basic_string<char>& aSrc, const std::locale& aLoc )
{
wchar_t* const buf = new wchar_t[ aSrc.length()+1 ];
std::use_facet<std::ctype<wchar_t> >(aLoc).widen( aSrc.data(), &aSrc.data()[aSrc.length()], buf );
buf[aSrc.length()] = 0;
const std::basic_string<wchar_t> ret_str(buf);
delete[] buf;
return ret_str;
}
// wstring to string, place '*' if there's no translation
template<> inline const std::basic_string<char> char_cast( const std::basic_string<wchar_t>& aSrc, const std::locale& aLoc )
{
char* const buf = new char[ aSrc.length()+1 ];
std::use_facet<std::ctype<wchar_t> >(aLoc).narrow( aSrc.data(), &aSrc.data()[aSrc.length()], '*', buf );
buf[aSrc.length()] = 0;
const std::basic_string<char> ret_str(buf);
delete[] buf;
return ret_str;
}
// char to char, do nothing
template<> inline const char char_cast( const char& aSrc, const std::locale& aLoc )
{
return aSrc;
}
// wchar_t to wchar_t, do nothing
template<> inline const wchar_t char_cast( const wchar_t& aSrc, const std::locale& aLoc )
{
return aSrc;
}
// char to wchar_t
template<> inline const wchar_t char_cast( const char& aSrc, const std::locale& aLoc )
{
return std::use_facet<std::ctype<wchar_t> >(aLoc).widen( aSrc );
}
// wchar_t to char, place '*' if there's no translation
template<> inline const char char_cast( const wchar_t& aSrc, const std::locale& aLoc )
{
return std::use_facet<std::ctype<wchar_t> >(aLoc).narrow( aSrc );
}
#pragma warning( default : 4996 ) |
Du kannst damit sowohl zwischen einfachen Zeichen (also char und wchar_t) als auch zwischen std::string und std::wstring casten. Das benutzt du dann so: CPP: | std::string str = "hallo";
std::wstring wstr = char_cast<std::string>( str );
// mögliche Casts (können erweitert werden durch hinzufügen weiterer
// Spezialisierungen des Grundtemplates):
char_cast<std::string>( unicode-string )
char_cast<std::wstring>( ascii-string )
char_cast<char>( unicode-zeichen )
char_cast<wchar_t>( ascii-zeichen ) |
btw: GreatFlo hat Folgendes geschrieben: | Wo is der Vorteil bei der Verwendung von Unicode vs. MultiByte? |
bei Unicode-Verwendung bist du unabhängiger und flexibler, d.h. dein Spiel hängt nicht von einer Sprache ab die nur das deutsche (lat.) Schriftlayout nutzt. Nebenbei sind in dem weltweiten Unicode-Zeichensatz auch Mathematische Zeichen und so dabei.
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
|