Hallo Forum, ich habe folgendes Problemchen, ich möchte abhängig davon, ob das Programm mit --server gestartet wird entweder die "normale" Version oder die Serverversion starten. Mein Fenster w wird nicht angezeigt, bzw ich vermute, dass es sobald es aus der Schleife wieder raus ist geschlossen und gelöscht wird. Stimmt das? -------------- #include <QtGui/QApplication> #include "client.h" #include "server.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); if (argc>1) { Server w; w.show(); } else { Client w; w.show(); } return a.exec(); } --------------- also dachte ich, ich kann die Sache mit Goto lösen. Leider geht auch das folgende nicht: ------------ #include <QtGui/QApplication> #include "client.h" #include "server.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); if (argc>1) goto starteclient; else goto starteserver; starteserver: { Server w; w.show(); } goto ende; starteclient: { Client w; w.show(); } ende: return a.exec(); } -------- habe ich keine Klammern bei den Sprungmarken gibt es "error: crosses initialization of ...", habe ich Klammern dort, gibt es das selbe Ergebnis wie bei der Klammerung im ersten Beispiel. Der Client und Servercode sind an sich ok. Wenn ich die Teile einzeln teste wird das Fenster angezeigt. Nur in den Klammern geht es nicht. Könnt ihr mir bitte erklären, warum das so ist und wie ich das ganze lösen kann? Vielen Dank schonmal Walter
Walter schrieb: > dass es sobald es > aus der Schleife wieder raus ist geschlossen und gelöscht wird. So ist es. Bitte bitte kein goto verwenden. Entweder du legst Client und Server als Variablen in den Scope der main-Funktion, also so wie die QApplication. Oder die vermutlich bessere Variante ist, da speichersparender, "return a.exec();" in beide if-Pfade zu legen.
Warum sollte sich das Problem der ersten Variante durch Verwendung von goto lösen lassen? Die Logik hinter dieser Idee erschließt sich mir nicht so recht. > habe ich keine Klammern bei den Sprungmarken gibt es "error: crosses > initialization of ...", Kein Wunder. > habe ich Klammern dort, gibt es das selbe > Ergebnis wie bei der Klammerung im ersten Beispiel. Auch kein Wunder, siehe meine erste Frage. Vergiss die "Idee" mit dem goto einfach gleich wieder. Welche Verbindung haben Deine "clients" und "server" mit dem Applikationsobjekt a? So recht kann ich da keinen Bezug erkennen. Wie sieht denn die funktionierende "server"- und wie die funktionierende "client"-Anwendung (als Standalone geschrieben) aus?
Danke, hab die Lösung mit dem zusätzlichen return genommen. Manchmal sieht man den Wald vor lauter Bäumen nicht ;) Aber wirklich glücklich bin ich damit noch nicht. falls in main mal mehr Code anfällt, wird vieles doppelt drinstehn müssen. Aber erstmal langts, also hab vielen Dank!
Rufus Τ. Firefly schrieb: > Warum sollte sich das Problem der ersten Variante durch Verwendung von > goto lösen lassen? Die Logik hinter dieser Idee erschließt sich mir > nicht so recht. Naja, ich dachte er kann dann zur Laufzeit entscheiden, welche Klasse w werden soll. Dass das hier aber Compilerlevel ist, ist mir entgangen. > Welche Verbindung haben Deine "clients" und "server" mit dem > Applikationsobjekt a? So recht kann ich da keinen Bezug erkennen. Das ist qt. Das ist da so "ganz normal". > Wie sieht denn die funktionierende "server"- und wie die funktionierende > "client"-Anwendung (als Standalone geschrieben) aus? Ist ein Qt-Stub der nur ein Fenster darstellt und hat eigentlich nichts mit dem Problem an sich zu tun.
Walter schrieb: > if (argc>1) > { > Server w; Hier wird dein Server-Objekt erzeugt. > w.show(); Hier wird ihm gesagt, daß es bei nächster Gelegenheint mal sichtbar werden soll. > } Und hier wird es wieder zerstört, da der "scope" der Variable w endet. Wenn du es mit new erzeugst, wird es gehen. Sowas würde sich anbieten:
1 | QWidget* w; |
2 | |
3 | if (argc>1) |
4 | {
|
5 | w = new Server(); |
6 | }
|
7 | else
|
8 | {
|
9 | w = new Client(); |
10 | }
|
11 | w->show(); |
12 | return app.exec(); |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.