dr1nk Geschrieben 13. Juni 2009 Geschrieben 13. Juni 2009 (bearbeitet) Hi FI's, ich versuche mich grade an grafischer Oberfläche in Visual C++ 2008 (Windows Forms). Ich möchte jetzt einen kleinen "Taschenrechner" programmieren, der 2 Zahlen addiert/subtrahiert/multipliziert/dividiert. Ich hab aber ein Problem bei der Ausgabe des Ergebnisses. Das ist meine Klasse: #ifndef C_KONVERTIEREN_H #define C_KONVERTIEREN_H class C_Konvertieren { private: double zahl1; double zahl2; double ergebnis; public: C_Konvertieren(); ~C_Konvertieren(); void addiere(System::String^,System::String^,System::String^); void subtrahiere(System::String^,System::String^,System::String^); void multipliziere(System::String^,System::String^,System::String^); void dividiere(System::String^,System::String^,System::String^); void convert_eingabe(System::String^,System::String^); void convert_ausgabe(System::String^); }; #endif Das ist mein Eventhandler (Nur einer, weil die anderen 3 genauso sind); private: System::Void bt_addiere_Click(System::Object^ sender, System::EventArgs^ e) { rechnen.addiere(this->tb_erste_Zahl->Text, this->tb_zweite_Zahl->Text, this->lb_Ergebnis_Anzeige->Text); } Das sind die dazugehörigen Methoden: void C_Konvertieren::addiere(System::String^ z1, System::String^ z2, System::String^ z3) { convert_eingabe(z1,z2); ergebnis = zahl1 + zahl2; convert_ausgabe(z3); } //Das sind die Konvertier-Methoden void C_Konvertieren::convert_eingabe(System::String^ z1, System::String^ z2) { zahl1 = Convert::ToDouble(z1); zahl2 = Convert::ToDouble(z2); } void C_Konvertieren::convert_ausgabe(System::String^ z3) { z3 = Convert::ToString(ergebnis); } Die Eingaben erfolgen über TextBoxen und die Ausgabe ist in einem Label. Das Programm läuft, nur es wird kein Ergebnis angezeigt. Hat evtl. einer von euch eine Idee woran das liegen könnte? Und ich hab so viele volle Parameterlisten - Gibt es da vielleicht schönere Lösungen? Ich möchte nicht, dass irgendeiner meine "Hausaufgaben" macht, ich verzweifel nur so langsam an dem Programm Ich bin für jede Antwort, die mich ein bisschen weiter bringt, sehr dankbar. Ich hab auch nochmal den ganzen Projektordner hochgeladen, falls es besser hilft: Datei Upload, Bilder hochladen, Datei Hosting auf Materialordner.de Bearbeitet 13. Juni 2009 von dr1nk Falsche Überschrift Zitieren
Amstelchen Geschrieben 13. Juni 2009 Geschrieben 13. Juni 2009 was steht denn in den variablen, wenn du den code debuggst? wozu die herumkonvertiererei? eine funktion addiere, die numerische werte entgegennimmt, die bereits zuvor korrekt behandelt wurden, sollte doch reichen - dann könntest du dir auch das konvertierungsmodul ersparen. üblicherweis macht man es auch so, dass funktionen, die nur einzelne ergebnisse wie addierte werte liefern (und z.b. kein inkrement) via return als call by value und nicht als call by reference aufgesetzt werden. zweiteres ist zwar möglich, aber oft umständlich. s'Amstel Zitieren
dr1nk Geschrieben 13. Juni 2009 Autor Geschrieben 13. Juni 2009 also mein code berechnet korrekt die eingabe. das ganze konvertieren mach ich, weil sich diese zeilen oft wiederholen. deswegen wollte ich die in eine funktion schreiben und diese immer aufrufen, wenn ich sie brauche. und wie soll das dann mit call by value aussehen? wenn ich mich nicht irre, macht das ja nur bei der 'convert_ausgabe' sinn... Zitieren
Klotzkopp Geschrieben 13. Juni 2009 Geschrieben 13. Juni 2009 Das Programm läuft, nur es wird kein Ergebnis angezeigt. Hat evtl. einer von euch eine Idee woran das liegen könnte? Dem Namen lb_Ergebnis_Anzeige nach zu urteilen, liegt es daran, dass du versuchst, das Ergebnis in einer Listbox anzuzeigen. Das Text-Property eines Listbox-Steuerlements verhält sich aber anders als das Text-Property eines Eingabefeldes. Siehe ListBox.Text Property (System.Windows.Forms) Zitieren
dr1nk Geschrieben 13. Juni 2009 Autor Geschrieben 13. Juni 2009 Dem Namen lb_Ergebnis_Anzeige nach zu urteilen, liegt es daran, dass du versuchst, das Ergebnis in einer Listbox anzuzeigen. Nein, das 'lb' soll für Label stehen. Kürzt man das anders ab? Zitieren
Klotzkopp Geschrieben 13. Juni 2009 Geschrieben 13. Juni 2009 Nein, das 'lb' soll für Label stehen. Kürzt man das anders ab?Du kannst deine Variablen nennen, wie du möchtest. Du kannst aber daran erkennen, dass du wichtigen Code nicht gezeigt hast, nämlich den, aus dem man den Typ von lb_Ergebnis_Anzeige erkennen könnte. Wenn du CLR-Objekthandles als Funktionsparameter benutzt, ist das ein "call by value", d.h. die Funktion kann die Werte nicht ändern, weil sie mit lokalen Kopien arbeitet. Benutze System::String^% als Parametertyp. Ich möchte mich aber Amstelchens Kritik anschließen. Stringparameter für Berechnungsfunktionen sind Blödsinn, und statt Referenzparametern wären Rückgabewerte besser. Die ganze Klasse C_Konvertieren wäre damit überflüssig. Überhaupt kommt es mir immer sofort komisch vor, wenn eine Klasse eine Tätigkeit beschreibt, und kein Objekt. Zitieren
dr1nk Geschrieben 13. Juni 2009 Autor Geschrieben 13. Juni 2009 Ich möchte mich aber Amstelchens Kritik anschließen. Stringparameter für Berechnungsfunktionen sind Blödsinn, und statt Referenzparametern wären Rückgabewerte besser. Tut mir leid, aber ich kann dir nicht ganz folgen. Wie soll ich denn mit nur einer Methode 2 Werte via call by value zurückgeben? (Im Fall: convert_eingabe) Oder meinst du ganz konkret, dass ich convert_ausgabe via call by value zurückgeben soll? Und nochmal: Liegt das Problem jetzt daran, dass die Werte falsch übergeben werden? Zitieren
Klotzkopp Geschrieben 13. Juni 2009 Geschrieben 13. Juni 2009 Tut mir leid, aber ich kann dir nicht ganz folgen. Wie soll ich denn mit nur einer Methode 2 Werte via call by value zurückgeben? (Im Fall: convert_eingabe)convert_eingabe gibt doch sowieso nichts raus, also stellt sich dort diese Frage nicht. Oder meinst du ganz konkret, dass ich convert_ausgabe via call by value zurückgeben soll?Ich meine ganz konkret, dass du diese komische Klasse rauswerfen solltest. Objektorientierung bedeutet nicht, alles irgendwie in Klassen zu packen. Und nochmal: Liegt das Problem jetzt daran, dass die Werte falsch übergeben werden?Das habe ich doch schon geschrieben. Wenn du einen System::String^-Parameter hast, dann wirken sich Änderungen an diesem Parameter nicht auf den Aufrufer aus. C_Konvertieren::convert_ausgabe bewirkt gar nichts, dasselbe gilt für den letzten Parameter deiner Berechnungsmethoden. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.