JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Problem mit std::map
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
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 18.09.2004, 18:31    Titel: Problem mit std::map Antworten mit Zitat

Warum geht das hier nicht?
Code:
   int var = 5;
   map<char*,int*> test;
   test["var"] = &var;

   *(test["var"]) = 10;


Will auch mal die STD::Map Funktion ausprobieren, aber da hatte ich wohl schon recht diese Funktion davor noch nicht benutz zu haben...

Ich kriege in der letzten Zeile einen Unhandled Exception Aufruf, aber nur im Debug Modus...
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 18.09.2004, 19:55    Titel: Antworten mit Zitat

Ich vermute, dass das an dem char* liegt.
Du hast ja das "var", das du der Map übergibst (wenn ich mich nicht irre) nirgendwo statisch im Speicher, sondern nur temporär.
Char* ist ja eigentlich auch nur ein Zeiger auf den ersten Char. Aber wie willst du den übergeben, wenn du ihn nur "on-the-fly" erstellst?

Wenn du es mit STL-Strings probierst, müsste es gehen. Sonst kannst du das auch mal so versuchen:
Code:
int var = 5;
char* schluessel="var";

map<char*,int*> test;
test[schluessel] = &var;

*(test[schluessel]) = 10;

_________________
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
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

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

Nein, denn es ist nicht temporär, sondern statisch in der Exe. Deshalb ist es das gleiche wie char string[]="var"; Das hatte ich schon davor ausprobiert und es ging nicht. Ich kriege ja auch nur im Debug Modus diese Meldung...im Release funktioniert ja alles..
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 18.09.2004, 21:28    Titel: Antworten mit Zitat

Ein char* ist ein Zeiger und jeder neue String den du erstellst kriegt natürlich eine eigene Adresse... wenn du per String auf die Map zugreifen willst musst du schon std::string nehmen, oder einen eigenen Typen.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 19.09.2004, 08:29    Titel: Antworten mit Zitat

Warum funktioniert dass dann im Release Modus? Selbst wenn ich das mit 10 verschiedenen Strings(char*) ausprobiere?

std::string ist zu lahm für Spiele und häufige Aufrufe und sollte deshalb vermieden werden Wink
(sicher&bequem aber gottverdammtlahm)
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 19.09.2004, 15:13    Titel: Antworten mit Zitat

Was meinst du mit "funktioniert"?
Dass du keine Fehlermeldung bekommst?

(die map wird nach addressen sortiert und der zugriff erfolgt auch über addressen und nicht über einen string, wie Hazel bereits sagte)
_________________
Kochen ist ein NP-schweres Optimierungsproblem.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 19.09.2004, 15:19    Titel: Antworten mit Zitat

Ja und dass die Map auch die richtigen Werte zurückliefert. Im Buch auf S.243 wird die Map aber genauso eingesetzt wie ich es mache...
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 19.09.2004, 15:23    Titel: Antworten mit Zitat

Zitat:

std::string ist zu lahm für Spiele und häufige Aufrufe und sollte deshalb vermieden werden
(sicher&bequem aber gottverdammtlahm)


Was genau soll an einem STL String langsam sein? Kann ich leider nicht nachvollziehen... und was hast du denn damit vor, dass Strings in deinem Programm zum Performancebottleneck werden könnten.. ?
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

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

RPG, ScriptEngine, die muss ja viel mit Strings machen.
strings überprüfen z.B. andauernd ob jeder Befehl im erlaubten Speicherbereich stattfindet,etc... Sagen wir ich brauche so im Schnitt 5 if Abfragen mehr, dadurch aber auch 2*5 Aufrufe von Variablen. Das wären dann 15 Befehle mehr alles nur ~ , ich verarbeite pro Sekunde ~600 Strings --> 600*15 = 9000 zusätzliche Befehle in der SEKUNDE!! -- Nein, DANKE!
Will ja keinen Frameeinbruch haben, die Grafik schluckt heutzutage eh keine Frames mehr, aber die Kollison schon und weil ne ScriptingEngine nur ein Zusatz ist und den braucht man ja in echt nicht, soll der mir nicht 20fps kosten...
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 19.09.2004, 15:33    Titel: Antworten mit Zitat

Das hat mal ein GDNet Mod von sich gegeben:

Code:

Well, a few misconceptions here that I see.

The first being that std::string is slow. How on earth did you arive at that? It's no slower than using a c-string, except that it will handle re-allocation for you. You can set it's size when you create it, and thus avoid re-allocation if you want. It's indexing operator ([]) provides constant time access (and is in every sense of the word the exact same thing as using a c-string indexer). Using the at method gives you bounds checked safety as well, something you don't get with c-strings, unless you write it. Your compiler will most often optimize out the indexer use in release mode.

Looking over the examples provided, you can already see how easy it is to fuck up with c-strings. Simple things such as delete vs delete[], exception safety, hell, even how to reallocate a c-string.

Not to mention, most standard library writers have a few tricks up their sleaves, things like having COW strings, and non-COW for MT.

As long as you use references, and const references wherever you can, you will not have any overhead due to copies, and it's the same thing as you would be doing with the c-string. As far as file access goes, believe me, you should be more worried about the speed of the disk. Not to mention, there are plenty of string operations for reading from a disk if you are using the STL.

_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 19.09.2004, 15:34    Titel: Antworten mit Zitat

TheMillenium hat Folgendes geschrieben:
RPG, ScriptEngine, die muss ja viel mit Strings machen.
strings überprüfen z.B. andauernd ob jeder Befehl im erlaubten Speicherbereich stattfindet,etc... Sagen wir ich brauche so im Schnitt 5 if Abfragen mehr, dadurch aber auch 2*5 Aufrufe von Variablen. Das wären dann 15 Befehle mehr alles nur ~ , ich verarbeite pro Sekunde ~600 Strings --> 600*15 = 9000 zusätzliche Befehle in der SEKUNDE!! -- Nein, DANKE!
Will ja keinen Frameeinbruch haben, die Grafik schluckt heutzutage eh keine Frames mehr, aber die Kollison schon und weil ne ScriptingEngine nur ein Zusatz ist und den braucht man ja in echt nicht, soll der mir nicht 20fps kosten...


Genau darum werden Scripts in Bytecode kompiliert, bevor man sie verarbeitet und strcmp ist auch nicht schneller als der Überladene == Operator für strings. ;)
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 19.09.2004, 15:36    Titel: Antworten mit Zitat

Wenn du eine eigene Scriptengine schreiben willst könnte das hier für dich interessant sein. :)

http://dinosaur.compilertools.net/

Yacc und Lex
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 19.09.2004, 15:42    Titel: Antworten mit Zitat

Mhhh das ist einer gegen Viele. Ich habe oft auf Techseiten gelesen dass std::string sehr lahm sein soll und jetzt spricht einer dagegen...dabei weiß ich weder was GDNet ist noch ob der Mod genug Referenzen hat, dass er wirklich das Wissen hat um gerechtfertigt das sagen zu können....

Ich habe immer nur auf den Seiten gelesen, wenn man kein Anfänger ist und mit chars umgehen kann, soll man chars benutzen wenn man Performance braucht. Will man immer auf der sicheren Seite stehen, sollte man doch std::string benutzen...

Ich kenne eh kaum Vorteile von std::string, ich kenne nur diese:
1. sicherer weil, keine Neuallokierung, schreibt immer auf zugelassene Speicherbereiche, kümmert sich um Deallkierung,..
2. überladener + Operator

Ich bin schon langsam dabei die std dort zu benutzen wo ich es für sinnvoll halte...aber vllt finde ich ja einen Beitrag dazu mal in der MSDN oder in nem Programmierbuch über STD...
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 19.09.2004, 17:02    Titel: Antworten mit Zitat

Ja aber jetzt wo du mir erklärt hast was du damit willst, frag ich mich wieso char* schneller sein soll als string? Hört sich an als würdest du sie nur oft vergleichen.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 19.09.2004, 17:56    Titel: Antworten mit Zitat

Ja, aber dann muss ich ja immer c_str() oder wie das heißt auch verwenden um sie zu vergleichen und das würde ja dann auch langsamer, oder?

Also wenn ich sie nur vergleiche und sie von meiner Klasse verwalte die chars dann kann ja nichts passieren und ich brauche ja damit auch die std::string Funktionalitäten gar nicht, die Exe bleibt kleiner wegen den Header, weniger Speicherverbrauhc die Methoden müssen auch nciht geladen werden...

Also so gravierend wir der Unterschied wahrscheinlcih in einem herkömmlichen Projekt nicht sein, nur wenn man hunderte strings gleichzeitig pro Sekunde aufruft kann das etwas schon etwas Gewaltiges ausmachen. Wink
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht 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