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

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 03.08.2007, 16:33 Titel: |
|
|
David hat Folgendes geschrieben: | DirectXer hat Folgendes geschrieben: |
CPP: | std::string str( "dies ist ein string" );
// ist äquivalent (nicht 100% gleich, aber mit dem gleichen Effekt nur langsamer) zu:
std::string str = "dies ist ein string"; |
|
Ist sogar exakt das Selbe! |
bei MSVC++ vielleicht (hab mir grad den assembler code angeschaut), dies ist aber compilerabhängig! In beiden Fällen wird hier (wie auch bei Copy-Constructors) der Konstruktor mit char* aufgerufen. Es ist aber durch den standard nicht festgelegt ob in speziellen Fällen das so umgewandelt wird (es gab mal eine ausgiebige diskussion darüber im gamedev.net) oder ob nicht erst ein Standardkonstruktor den Stringerstellt und dann operator= aufgerufen wird. Das bezieht sich allerdings nur auf die generische Programmierung mit templates. Es kann deshalb übrigens auch bei manchen Compilern Probleme geben, wenn man die untere Zeile in global space schreibt.
Ach ja, david, es ist selten dass ein Memberoperator[] den Schreibzugriff als const-correct behandelt, den Lesezugriff dagegen nicht naja Flüchtigkeisfehler, passiern jedem
@RebornX: dieses Makro das du meinst heißt MAKELONG( lowWord, highWord ). Es gibt übr. auch MAKEWORD( lowByte, highByte ) um ein Word nochmal zu unterteilen.
Gruß DXer |
|
Nach oben |
|
 |
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 03.08.2007, 16:49 Titel: |
|
|
DirectXer hat Folgendes geschrieben: | David hat Folgendes geschrieben: | DirectXer hat Folgendes geschrieben: |
CPP: | std::string str( "dies ist ein string" );
// ist äquivalent (nicht 100% gleich, aber mit dem gleichen Effekt nur langsamer) zu:
std::string str = "dies ist ein string"; |
|
Ist sogar exakt das Selbe! |
bei MSVC++ vielleicht (hab mir grad den assembler code angeschaut), dies ist aber compilerabhängig! In beiden Fällen wird hier (wie auch bei Copy-Constructors) der Konstruktor mit char* aufgerufen. Es ist aber durch den standard nicht festgelegt ob in speziellen Fällen das so umgewandelt wird (es gab mal eine ausgiebige diskussion darüber im gamedev.net) oder ob nicht erst ein Standardkonstruktor den Stringerstellt und dann operator= aufgerufen wird. Das bezieht sich allerdings nur auf die generische Programmierung mit templates. Es kann deshalb übrigens auch bei manchen Compilern Probleme geben, wenn man die untere Zeile in global space schreibt. |
Nein, im zweiten Beispiel wird niemals der = Operator aufgerufen, hier wird das immer per copy initialisation initialisiert! Eigentlich ist der Vorgang etwas anderst als beim ersten Beispiel, nämlich:
CPP: | std::string str = "dies ist ein string";
|
wird zu:
CPP: | std::string tmp( "dies ist ein string" );
std::string str( tmp );
|
Dem Compiler steht es allerdings in diesem Fall frei auf das erstellen des temporären Objekts zu verzichten und kann somit direkt den entsprechenden Konstruktor aufrufen. Es wird aber niemals!!!! der Zuweisungsoperator aufgerufen!
Beispiel:
CPP: | struct foo
{
foo ( const char* test )
{
std::cout << "foo::foo( const char* )" << std::endl;
}
foo ( const foo& rhs )
{
std::cout << "foo::foo( const foo& )" << std::endl;
}
// Diese beiden Funktionen werden in dem Beispiel NIE aufgerufen
foo& operator=( const char* test )
{
std::cout << "foo::operator=( const char* )" << std::endl;
return *this;
}
foo& operator=( const foo& rhs )
{
std::cout << "foo::operator=( const foo& )" << std::endl;
return *this;
}
};
int main()
{
foo x = "Hallo Welt"; // ruft foo::foo( const char* ) auf
foo y( "Hallo Welt" ); // genau wie oben
std::cin.get();
}
|
ABER der Copy konstruktor wird im Beispiel trotzdem benötigt, obwohl er nicht direkt aufgerufen wird:
CPP: | struct foo
{
foo ( const char* test )
{
std::cout << "foo::foo( const char* )" << std::endl;
}
private:
foo ( const foo& rhs )
{
std::cout << "foo::foo( const foo& )" << std::endl;
}
// Diese beiden Funktionen werden in dem Beispiel NIE aufgerufen
foo& operator=( const char* test )
{
std::cout << "foo::operator=( const char* )" << std::endl;
return *this;
}
foo& operator=( const foo& rhs )
{
std::cout << "foo::operator=( const foo& )" << std::endl;
return *this;
}
};
int main()
{
foo x = "Hallo Welt";
foo y( "Hallo Welt" );
std::cin.get();
}
|
Und zack... Der Compiler mäckert rum (nur der VC++ macht das nicht. Dies ist aber ein bekannter Bug den Microsoft unter keinen Umständen beheben wollte). Jeder Compiler der sich hier aber an den Standard hält mäckert und kompiliert den Code nicht richtig!
Und ja, das ist alles genau im Standard beschrieben und so vorgeschrieben! Da gibts nichts zu diskutieren, jedes andere Verhalten ist nicht standardkonform!
DirectXer hat Folgendes geschrieben: |
Ach ja, david, es ist selten dass ein Memberoperator[] den Schreibzugriff als const-correct behandelt, den Lesezugriff dagegen nicht naja Flüchtigkeisfehler, passiern jedem
|
Ja danke, gehört andersrum. |
|
Nach oben |
|
 |
RebornX JLI'ler

Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 03.08.2007, 17:11 Titel: |
|
|
DirectXer hat Folgendes geschrieben: |
@RebornX: dieses Makro das du meinst heißt MAKELONG( lowWord, highWord ). Es gibt übr. auch MAKEWORD( lowByte, highByte ) um ein Word nochmal zu unterteilen.
Gruß DXer |
JUHU genau das meinte ich!
So jetzt stehe ich mal wieder vor einem Problem :
Wie kann ich prüfen ob die Return Taste gedrückt wurde, wärend der Eingabefocus auf einem EditFeld ist ?? _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 03.08.2007, 17:15 Titel: |
|
|
david: ok, dann war es der Copy-Constructor und nicht Zuweisungsoperator. Ich hab gerade nochmal nachgeguckt, es war mir nur wichtig dass es klar ist, dass die Beiden Varianten eben nicht exakt dieselben sind. Deshalb sollte man den 1. bevorzugen... Diese Umwandlung geht auch z.B. nicht, wenn der Konstruktor mit char* als explicit deklariert wurde.
Gruß DXer
EDIT: RebornX: spontan würd ich sagen, entweder:
auf die WM_KEYDOWN zu warten, dann testen ob Enter gedrückt wurde und dann ggf. abfragen ob GetFocus() == hWndEdit. Oder
direkt im Code anstatt auf die Message zu warten CPP: | GetAsyncKeyState( VK_RETURN ) & 0x8000 | abzufragen
Zuletzt bearbeitet von DirectXer am 03.08.2007, 17:20, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 03.08.2007, 17:20 Titel: |
|
|
Na, es sind meist genau der selbe Vorgang, nur dann nicht wenn der Compiler zu dumm ist diesen Fall zu erkennen! Der VC++ ist leider etwas zu schlau, aber das ist ein anderes Thema. Wie auch immer, wenn der Compiler nicht optimiert ist die 1. Version schneller (irgendwie meine ich aus deinem Text herauszulesen das du sagen willst die 1. wär langsamer), ansonsten sind beide exakt gleich schnell.
Und explizit deklarierte Konstruktoren sind wieder ein gaanz anderes Thema!  |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 03.08.2007, 17:21 Titel: |
|
|
David hat Folgendes geschrieben: | (irgendwie meine ich aus deinem Text herauszulesen das du sagen willst die 1. wär langsamer) | Hehe nicht wirklich Ich hab ja auch in meinem Code Beispiel geschrieben die 2. wäre evtl langsamer. |
|
Nach oben |
|
 |
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 03.08.2007, 17:26 Titel: |
|
|
Omg...
Zitat: |
std::string str( "dies ist ein string" );
// ist äquivalent (nicht 100% gleich, aber mit dem gleichen Effekt nur langsamer) zu:
std::string str = "dies ist ein string";
|
Ersetzen wir die Ausdrücke durch A und B:
Zitat: |
A
// ist äquivalent (nicht 100% gleich, aber mit dem gleichen Effekt nur langsamer) zu:
B
|
Wir bekommen:
Zitat: |
A ist äquivalent (nicht 100% gleich, aber mit dem gleichen Effekt nur langsamer) zu B.
|
Streichen wir das überflüssige:
Zitat: |
A ist äquivalent (nur langsamer) zu B
|
Und da A an 1. Stelle steht ging ich davon aus das du sagen willst A sei langsamer...  |
|
Nach oben |
|
 |
RebornX JLI'ler

Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 03.08.2007, 17:42 Titel: |
|
|
DirectXer hat Folgendes geschrieben: |
EDIT: RebornX: spontan würd ich sagen, entweder:
auf die WM_KEYDOWN zu warten, dann testen ob Enter gedrückt wurde und dann ggf. abfragen ob GetFocus() == hWndEdit. Oder
direkt im Code anstatt auf die Message zu warten CPP: | GetAsyncKeyState( VK_RETURN ) & 0x8000 | abzufragen |
Ehm ne, das klappt auch nicht.
Also ich habe ein Editfeld mit einem OK Button nebenan.
Und ich will das wenn man Enter bzw Return klickt der OK Button geklickt wird.
Jedoch habe ich das Problem, dass wenn ich in das Editfeld etwas reinschreibe ist ja der Focus drauf gesetzt und wenn ich auf Return klicke interpretiert das Editfeld (denke ich mal) als Aufforderung in die nächste zeile zu springen (Das kann er aber nicht weil ich ES_AUTOVSCROLL definiert habe). Das soll er aber nicht. Er soll sobald ich auf Return klicke den OK-Button aktivieren.
Mir fällt dabei nur eine Lösung ein:
Unzwar indem ich noch eine extra window-Prozedur für das editfenster anlege, aber ich bin mir 100% sicher das es noch eine viel einfachere Lösung dafür gibt.
Ach und was heißt äquivalent ???  _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 03.08.2007, 17:56 Titel: |
|
|
@david: Du musst das im Kontext lesen! Sicher, wenn du so eine abstrakte Ersetzung durchführst dann kann man das schon missverstehen; aber ich hab in allen meinen Beiträgen und auch in diesem einen Kommentar auf die folgende Zeile bezogen. Ich hab auch vor dem Codeschnipsel diesen Kommentar im Text für die 1. Funktion geschrieben. Beziehst du also diesen Kommentar auf die nächste Zeile so siehst du: CPP: | std::string str( "dies ist ein string" );
// (diese nächste folgende Zeile) ist äquivalent (nicht 100% gleich, aber mit dem gleichen Effekt nur langsamer) zu:
std::string str = "dies ist ein string"; | Und selbst wenn das nicht klar genug ist, müsstest du aus meinen nächsten Posts gelesen haben, dass ich eindeutig die 2. Variante als langsamer umschrieben hab, indem ich gesagt hab, dass beim 1. nur der Konstruktor aufgerufen wird und beim 2. ggf. _noch_ die Kope erzeugt wird (bzw. der Zuweisungsoperator, was ich oben fälschlicherweise geschrieben hab)...
Ok, Ich denke wir sollten solche minimalen (und das sind sie ziemlich ) Haarspaltereien demnächst per PM erledigen und nicht Threads, die sich um völlig andere Gebiete handeln, damit zutexten. Der arme RebornX weiß ja gar net mehr was er lesen soll und was net
Gruß DXer |
|
Nach oben |
|
 |
RebornX JLI'ler

Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 03.08.2007, 18:43 Titel: |
|
|
es kann sein, dass dein Fenster die Nachricht nicht bekommt weil das edit den Fokus hat, was ich mir aber nur schwer vorstellen kann... Hmm, hast du mal die Nachricht WM_SYSKEYDOWN probiert? Die wird auch bei inaktiven Fenstern gesendet. Dann musst du aber auch mit GetFocus auf Aktivität testen, damit es nicht bei jedem Enter-klick aufgerufen wird. Oder du versuchst einfach mal zu debuggen wenn du bei WM_KEYDOWN nen breakpoint setzt. Dann siehst du ob und wann die Nachricht gesendet wird.
Gruß DXer |
|
Nach oben |
|
 |
RebornX JLI'ler

Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 03.08.2007, 18:56 Titel: |
|
|
hmm, mit WM_SYSKEYDOWN klappts auch nicht.
Und naja die Nachricht wird gesendet sobald der Focus nicht mehr auf das Editfenster zeigt und ich auf Eingabe klicke...
http://nopaste.de/p/aCxEb2NMi _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
Nach oben |
|
 |
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 03.08.2007, 19:04 Titel: |
|
|
DirectXer hat Folgendes geschrieben: | @david: Du musst das im Kontext lesen! Sicher, wenn du so eine abstrakte Ersetzung durchführst dann kann man das schon missverstehen; aber ich hab in allen meinen Beiträgen und auch in diesem einen Kommentar auf die folgende Zeile bezogen. Ich hab auch vor dem Codeschnipsel diesen Kommentar im Text für die 1. Funktion geschrieben. Beziehst du also diesen Kommentar auf die nächste Zeile so siehst du: CPP: | std::string str( "dies ist ein string" );
// (diese nächste folgende Zeile) ist äquivalent (nicht 100% gleich, aber mit dem gleichen Effekt nur langsamer) zu:
std::string str = "dies ist ein string"; | Und selbst wenn das nicht klar genug ist, müsstest du aus meinen nächsten Posts gelesen haben, dass ich eindeutig die 2. Variante als langsamer umschrieben hab, indem ich gesagt hab, dass beim 1. nur der Konstruktor aufgerufen wird und beim 2. ggf. _noch_ die Kope erzeugt wird (bzw. der Zuweisungsoperator, was ich oben fälschlicherweise geschrieben hab)... |
Naja, ich halte es nicht für eine abstrakte Ersetzung sondern eher für logisch. Da steht nichts von nächter Zeile und ist äquivalent... hört sich für mich sehr als ein Fortsatz des Ausdrucks darüber an... Wie auch immer, nun weiß ich ja was du meintest. Korrekt ist es trotzdem nur halbwegs. |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 03.08.2007, 19:22 Titel: |
|
|
Hier schliesse ich mich David an, das Kommentar war für mich vom Inhalt her auf die erste Zeile bezogen  _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
RebornX JLI'ler

Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 03.08.2007, 19:28 Titel: |
|
|
WIE AUCH IMMER!! XD
Können wir jetzt wieder zu meinem Problem kommen ??  _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
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
|