Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Erste Versuche Visual C++ GUI Taschnrechner - Ausgabe Problem

Empfohlene Antworten

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

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

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

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)

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?

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.

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?

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.