JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

char* Zeiger bei fstreams

 
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: 26.03.2008, 14:07    Titel: char* Zeiger bei fstreams Antworten mit Zitat

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
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: 26.03.2008, 15:31    Titel: Re: char* Zeiger bei fstreams Antworten mit Zitat

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
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: 26.03.2008, 18:00    Titel: Antworten mit Zitat

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
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: 26.03.2008, 19:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


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

BeitragVerfasst am: 26.03.2008, 20:14    Titel: Antworten mit Zitat

gut, dann guck ich mir boost an.
Das wollte ich eh schon immer mal benutzen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


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

BeitragVerfasst am: 29.03.2008, 20:23    Titel: Antworten mit Zitat

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
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: 29.03.2008, 20:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


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

BeitragVerfasst am: 29.03.2008, 21:16    Titel: Antworten mit Zitat

Ä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
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: 29.03.2008, 21:39    Titel: Antworten mit Zitat

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
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
Seite 1 von 1

 
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