[Anfänger] Taschenrechner will nicht wie ich will

eyra

Grünschnabel
Hallo C++ Community

Ich bin mir gerade ein bisschen C++ am beibringen und hab schon etliche Probleme selbst und Dank Hilfe dieses Forums bewältigt, nun bin ich jedoch an einen Fehler geraten wo ich nicht mehr weiter weiss. Vielleicht kann mir ja jemand von euch helfen :)

- Win XP
- VC++ 6
- MFC

Ich codiere mir zu Übungszwecken einen kleinen simplen Taschenrechner. Das Problem an der ganzen Sache sind wohl die Datentypen, weil meine Anzeige in Strings angezeigt wird ^^
Die Eingabe der Zahlen erfolgt über Buttons und wenn diese mehrmals angeklickt werden, dann hängen sich auch die Zahlen hintereinander wie sie eigentlich sollten. Die Ausrechnung funktioniert auch
ABER (hehe) wenn ich eine weitere Zahl mit strcat an den String hänge, erscheint folgende Fehlermeldung beim Klick auf den Gleich-Button

26355attachment.jpg

Mein Code sieht folgendermassen aus:

Code:
/***************** Funktionsmember CRechnerView::OnBgleich ****************/

void CRechnerView::OnBgleich() 
{

		int resultat;
		char * temp;
		char buffer[10];
		CString str;
		char * strneu;
		char * bla;


		switch (m_anzeige2[0]) //ASCII Wert
		{

			case '+': resultat = atoi(m_anzeige1) + atoi(m_anzeige3);
					  break;
			case '-': resultat = atoi(m_anzeige1) - atoi(m_anzeige3);
					  break;
			case '/': resultat = atoi(m_anzeige1) / atoi(m_anzeige3);
					  break;
			case '*': resultat = atoi(m_anzeige1) * atoi(m_anzeige3);
			          break;
		}

		temp = _itoa(resultat, buffer, 10);

		UpdateData(TRUE);
		

		m_anzeige4 = m_anzeige1+" "+m_anzeige2+" "+m_anzeige3+" = "+temp+"\r\n";
		m_anzeige1 = "";
		m_anzeige2 = "";
		m_anzeige3 = "";

		UpdateData(FALSE);		
}

/******************************* Ende Funktion ****************************/

Und hier noch der Code um die Zahlen aneinander zu hängen:
Code:
/****************** Funktionsmember CRechnerView::anzeige *****************/

void CRechnerView::anzeige()
{
	char buffer[10];
	char * temp;

	m_Tastestr = _itoa(m_Taste, buffer ,10);

	if (m_anzeige2 == "")
	{
		if (m_anzeige1 == "")
		{
			m_anzeige1 = m_Tastestr;
		}
		else
			if (m_anzeige1 != "")
			{
				temp = (char*)LPCTSTR(m_anzeige1);
				strcat(temp, m_Tastestr);
			}
	}
	
	if (m_anzeige2 != "")
	{
		if (m_anzeige3 == "")
		{
			m_anzeige3 = m_Tastestr;
		}
		else 
			if (m_anzeige3 != "")
			{
				temp = (char*)LPCTSTR(m_anzeige3);
				strcat(temp, m_Tastestr);
			}
	}

	if (m_anzeige1 == "")
	{
		if (m_anzeige2 != "")
		{

		}
	}


	UpdateData(FALSE);	
}

/******************************* Ende Funktion ****************************/

Ich hoffe ihr kommt bei meinem Programmierchaos einigermassen draus und wäre natürlich dankbar für jede kleinste Anregung/Hilfe ..

Und wenn ich schon gerade hier reinschreibe, vielleicht kann mir jemand einen Tipp geben wie ich in einem Editfeld mehrere Einträge einzeln nach und nach auf mehrere Zeilen schreiben kann?

Vielen Dank :D

Mit freundlichem Gruss
Christine
 
Hallo, Christine

leider ist aus deinem Bild nicht zu ersehen, wie du die Eingabe realisiert hast. Ich vermute mal, über Eingabefelder.
Bei deiner Funktion wird es wohl an der Stringbehandlung liegen. Wenn du Eingabefelder benutzt, erfolgt die Zuweisung an die Variable bei UpdateData() als CString und du bekommst den Zeiger darauf. Diese sind aber keine char-Arrays, sondern echte Strings. Deshalb kannst du nicht die char-Funktionen strcat o.ä. anwenden, sondern mußt die Memberfunktionen der CString-Klasse verwenden.
Diese Klasse hat überladene Funktionen für viele Operatoren. Aneinanderhängen von CStrings erfolgt einfach mit
Code:
CString ergebnis, string1, string2;

string1="ich singe ";
string2="lalala";
ergebnis = string1 + string2;
Das ergibt dann "ich singe lalala".
Damit erspardt du dir auch das viele Casten in der zweiten Funktion.

Mfg

langer
 

Neue Beiträge

Zurück