Zum Inhalt springen

Erste Versuche Visual C++ GUI Taschnrechner - Ausgabe Problem


dr1nk

Empfohlene Beiträge

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 :D

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 von dr1nk
Falsche Überschrift
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...