|
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: 26.03.2008, 14:07 Titel: char* Zeiger bei fstreams |
|
|
CPP: | ifstream File;
int Value=5;
File.read(Value, sizeof(int)); //int != char*
File.read(&Value, sizeof(int));// int* != char*
File.read((char*)Value, sizeof(int)); //das geht
File.read((char*)&Value, sizeof(int));// erst jetzt stimmt es
|
Jetzt ernsthaft, es ist mir schon 3-4 mal passiert, dass ich Variante 3 geschrieben habe. Was natürlich zu fiesen abstürzen führt. Insbesondere bei Arrays überseiht man manchmal, ob man daraus jetzt noch einen Zeiger machen muss oder nicht, oder wie auch immer.
Ich finde es einfach schlimm, dass das nicht typsicher ist und nicht als Kompilerfehler angezeigt wird. Nicht nur, dass es allgemein nervt, alles casten zu müssen, nein ich kann beim casten auch noch böse Fehler machen, die mein Compiler mir nicht sagt.
C++ Casts scheinen auch nichts zu bringen, static_cast will kein int* in ein char* machen und reinterpret_cast meckert nicht wenn das eine ein Zeiger ist, das andere aber nicht.
Immerhin ist das doch die C++ Standardbibliothek, und die Methode, die man heutzutage eigentlich benutzen sollte. Wieso geht das dann immer noch nicht einfacher? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 26.03.2008, 15:31 Titel: Re: char* Zeiger bei fstreams |
|
|
Jonathan_Klein hat Folgendes geschrieben: | reinterpret_cast meckert nicht wenn das eine ein Zeiger ist, das andere aber nicht. |
Kann sein, dass ich was verpasst habe, aber meines Wissens soll doch reinterpret_cast gar nicht bei sowas meckern. Der Name sagt ja schon, dass der Variableninhalt mit einem anderen Typ reinterpretiert werden kann. _________________ 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: 26.03.2008, 18:00 Titel: |
|
|
Ja, er meckert ja auch nicht, was gut ist, da man damit alles können soll. Aber gibt es nicht einen cast der zwar ein int* zu nem char* machen kann, aber kein int zu einem char*? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 26.03.2008, 19:59 Titel: |
|
|
du hast 2 Möglichkeiten:
1: schreib dir einfach deinen eigenen spezialisierten typsicheren Binärstream. Alles was du brauchst um das komfortabel zu gestalten ist: 2 Klassen binOFStream und binIFStream mit einem std::stream-objekt und den privaten Methoden write(const void*, std::streamsize) bzw. read(void*, std::streamsize) und öffentliche Methoden(die inline einfach die methode des STL-streams aufrufen) void close(), void open(), bool fail(), bool eof(), bool isOpen(). Dann machst schreibst du jeweils 12 typsichere operatoren << bzw. >> mit den 12 standard typen, die inline write() bzw. read() aufrufen. Für noch mehr Komfort kannst du noch Operatoren für vector, string, void(*p)(this) usw. definieren, schon hast du deinen eigenen typsicheren stream.
2: du greifst auf boost.iostreams zurück, bieten einfache implementationsmöglichkeiten für allerlei speizialisierte streams
Gruß DXer |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 26.03.2008, 20:14 Titel: |
|
|
gut, dann guck ich mir boost an.
Das wollte ich eh schon immer mal benutzen. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 29.03.2008, 20:23 Titel: |
|
|
Obwohl: void* ist doch 1 byte oder?
Also zumindest ist normalerweise void* immer 1 Byte. In den Umgebungen, die ich benutze, sollte man also void* verwenden können und müsste dann gar nicht mehr casten, oder? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 29.03.2008, 20:41 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: | Obwohl: void* ist doch 1 byte oder?
Also zumindest ist normalerweise void* immer 1 Byte. In den Umgebungen, die ich benutze, sollte man also void* verwenden können und müsste dann gar nicht mehr casten, oder? |
nein void* ist ein ganz normaler zeiger und hat 4 byte wie jeder andere Zeiger auf. Es steht nur dafür, dass der Typ nicht bekannt ist, aber von der Größe her ist es ein Zeiger |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 29.03.2008, 21:16 Titel: |
|
|
Äh, ja klar, mein ich ja.
Aber wenn mein einen int Zeiger hat und diesen um 1 erhöht, geht er dann nicht um 4 Bytes weiter? Ist ja zumindest bei einem Arrayzugriff so, das man auf Elemente und nicht auf Bytes des Arrays zugreift.
So müsste man dann ja, wenn man auf ein int Array per char* Zeiger zugreift, die Position jeweils *4 nehmen, um ein Element zu bekommen.
Verhält sich ein void* Zeiger also wie ein char* Zeiger? Ich weiß, das Typengröße nicht unbedingt festgelegt sind, aber normalerweise ist ja ein int 4 mal so groß wie ein char. Ist in diesem Normalfall ein void "so groß" wie ein char*? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 29.03.2008, 21:39 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: | Äh, ja klar, mein ich ja.
Aber wenn mein einen int Zeiger hat und diesen um 1 erhöht, geht er dann nicht um 4 Bytes weiter? Ist ja zumindest bei einem Arrayzugriff so, das man auf Elemente und nicht auf Bytes des Arrays zugreift.
So müsste man dann ja, wenn man auf ein int Array per char* Zeiger zugreift, die Position jeweils *4 nehmen, um ein Element zu bekommen.
Verhält sich ein void* Zeiger also wie ein char* Zeiger? Ich weiß, das Typengröße nicht unbedingt festgelegt sind, aber normalerweise ist ja ein int 4 mal so groß wie ein char. Ist in diesem Normalfall ein void "so groß" wie ein char*? |
nein, einen void-Zeiger kann man nicht inkrementieren. Da gibst meist die Fehlermeldung "void: unknown size" oder so. Falls du aber mit char* auf int* zugreift, musst du statt ++pChar immer pChar += 4, oder besser pChar += sizeof(int) schreiben. Falls das bei manchen Compilern Probleme gibt, kannst du auch std::advance(pChar, 4) benutzen. Was du da bei einem void-Zeiger machen könntest wäre std::advance<char*>(p, 4);
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
|