[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


Anmelden zum Antworten