JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Der "Windows-Programmierung"- Thread
Gehe zu Seite Zurück  1, 2, 3, 4, 5  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
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

BeitragVerfasst am: 03.08.2007, 16:33    Titel: Antworten mit Zitat

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 Razz naja Flüchtigkeisfehler, passiern jedem Smile

@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 03.08.2007, 16:49    Titel: Antworten mit Zitat

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 Razz naja Flüchtigkeisfehler, passiern jedem Smile


Ja danke, gehört andersrum.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 03.08.2007, 17:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 03.08.2007, 17:15    Titel: Antworten mit Zitat

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:
Arrow auf die WM_KEYDOWN zu warten, dann testen ob Enter gedrückt wurde und dann ggf. abfragen ob GetFocus() == hWndEdit. Oder
Arrow 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 03.08.2007, 17:20    Titel: Antworten mit Zitat

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! Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 03.08.2007, 17:21    Titel: Antworten mit Zitat

David hat Folgendes geschrieben:
(irgendwie meine ich aus deinem Text herauszulesen das du sagen willst die 1. wär langsamer)
Hehe nicht wirklich Razz Ich hab ja auch in meinem Code Beispiel geschrieben die 2. wäre evtl langsamer.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 03.08.2007, 17:26    Titel: Antworten mit Zitat

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... Rolling Eyes
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 03.08.2007, 17:42    Titel: Antworten mit Zitat

DirectXer hat Folgendes geschrieben:

EDIT: RebornX: spontan würd ich sagen, entweder:
Arrow auf die WM_KEYDOWN zu warten, dann testen ob Enter gedrückt wurde und dann ggf. abfragen ob GetFocus() == hWndEdit. Oder
Arrow 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 ??? Laughing
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

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

@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 Razz ) 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 Wink

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 03.08.2007, 18:28    Titel: Antworten mit Zitat

Nagut dann poste ich mal das ganze Problem:

http://nopaste.de/p/aVb1Rvwaob
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 03.08.2007, 18:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 03.08.2007, 18:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 03.08.2007, 19:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 03.08.2007, 19:22    Titel: Antworten mit Zitat

Hier schliesse ich mich David an, das Kommentar war für mich vom Inhalt her auf die erste Zeile bezogen Wink
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 03.08.2007, 19:28    Titel: Antworten mit Zitat

WIE AUCH IMMER!! XD

Können wir jetzt wieder zu meinem Problem kommen ?? Laughing
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2, 3, 4, 5  Weiter
Seite 4 von 5

 
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