[BCB 6] Bekomme Exception
-
Folgendes Problem:
Ich habe ein TEdit (edi_display) das ich für einen Taschenrechner brauche.
Der Rechner besteht aus jenem TEdit und einem Button(btn_enter). Per btn_enterClick soll der Inhalt von TEdit ausgelesen, auf Rechenzeichen ( * ) inspiziert werden und dann die zahlen vor und hinter dem Rechenzeichen miteinander multipliziert werden.
Ich erhalte aber immer eine Exception vom Debugger
//-------------------------------------------------------------------------- void __fastcall TRechner::btn_enterClick(TObject *Sender) { AnsiString sText = edi_display->Text; for(int i=1; i<=sText.Length(); i++) { char c = sText[i]; // Ersten Wert, der vor dem Operator im Editfeld steht einlesen if (c=='*') { AnsiString temp1; AnsiString temp2; for (int a = 1; a < i ; a++) { temp1[a] = sText[a]; } //Wert hinter dem Rechenzeichen einlesen for (int b = 1+i; b < sText.Length(); b++) { temp2[b] = sText[b]; } edi_display->Text = ((StrToInt(temp1)) * (StrToInt(temp2))); } } }Lässt sich kompilieren und linken, aber bei einer Eingabe wie 3*3 erhalte ich eine Exception.
Nebenbei :
//... edi_display->Text = ((StrToFloat(temp1)) * (StrToFloat(temp2)));lässt sich nicht kompilieren :
[C++ Error] Unit1.cpp(132): E2015 Ambiguity between '_fastcall System::AnsiString::AnsiString(char)' and '_fastcall System::AnsiString::AnsiString(short)'
-
Versuche es mal so:
void __fastcall TForm1::btn_enterClick(TObject *Sender) { AnsiString sText = edi_display->Text; AnsiString temp1, temp2; for(int i=1; i<=sText.Length() - 1; i++) { if (sText[i] != '*') { temp1 += sText[i]; } else { temp2 += sText[i + 1]; } } edi_display->Text = IntToStr(StrToInt(temp1) * StrToInt(temp2)); }Das -1 in der Zählschleife ist zum Überzählen des Multiplikationszeichens(*);),
wie das i+1 in der Zeile 10.Wenn du mal mit Nachkommawerten rechnen willst, empfiehlt sich aber doch evtl.
ein Button für das Multiplikationszeichen.MfG
kpeter
-
Sorry, aber euer beider Code ist falsch:
mulo:
AnsiString templ, sText; temp1[a] = sText[a];Du kannst nicht einfach an einen bestimmten Index in einen leeren String etwas einfügen.
Entweder du hängst die Zeichen immer hintendran:temp1 += sText[a];oder aber du benutzt am besten die Methode SubString:
temp1 = sText.SubString(1, i-1); // (Index, Anzahl)Dadurch sparst du dir die Schleife.
kpeter:
Deine Bedingung in der Schleife ist falsch, da beim Zeichen '*' nur einmal das nächste Zeichen nach temp2 geschrieben würde, alle nachfolgenden aber wieder in temp1.
-
Th schrieb:
oder aber du benutzt am besten die Methode SubString:
temp1 = sText.SubString(1, i-1); // (Index, Anzahl)Dadurch sparst du dir die Schleife.
Könntest du mit das evtl in meine Code einbauen.. Ich kann da nichts mit anfangen.

Gibts evtl. irgendwo etwas was mir den Umgang mit AnsiStrings erklärt und mir die einzelnen Methoden näherbringt?
-
Hallo
In der Builder-Hilfe steht alles wissenswerte zu AnsiString und seinen Methoden.
bis bald
akari