Kalkulator builder c++ StrToInt

0

Witam. Zabrałem się za kodzenie prostego kalkulatora w builderze. Otóż problem polega na tym, iż zrobiłem prostą funkcję, która powinna zamieniać stringi na int'y po to aby móc zrobić warstwę logiczną programu. Oto kod owej funkcji:

int konwersja_stringow()
{
liczby[0] = tekst[0];

     liczby[0] = StrToInt(liczby[0]);

     return 0;

}

Ale gdy próbuje kliknąć na button'a, który tą funkcję ma wywołaną w swoim OnClick'u, wyświetla się okno z informacją o błędzie:

"Project Project1.exe raised exception class EConvertError with message "1 'is not a valid integer value' Process stopped. Use Step or Run to continue."

Kompletnie nie wiem o co chodzi temu debuggerowi, pomocy!

0

Program wyrzuca wyjątek ponieważ tekst, który chcesz zamienić jest niepoprawny.

0

Funkcja ma 3 linie i każda zawiera poważny błąd.

 liczby[0] = tekst[0];

Co to ma robić? Przypisujesz pierwszy znak z tekstu do liczby.

liczby[0] = StrToInt(liczby[0]);

Nie zastanawia Cię, że zarówno po lewej stronie jak i po prawej masz liczby[0]? To ma być konwersja ze stringa do liczby, a podajesz mu liczbę.

return 0

Ta funkcja zawsze zwraca 0, zamiast wynik konwersji.

0

Nie rozumiem. Wszystkie zmienne, które chce przekonwertować to liczby.

0

Chodzi mi o to, że zmienna liczba to string.

0

Pokaż deklaracje tablic liczby i tekst.

0

Żeby raz napisać funkcję, a nie musieć kopiować do wszystkich OnClick'ów. A jest jakaś różnica między wywołaniem funkcji w OnClick'u, a napisaniem kodu funkcji w OnClick'u?

0

Po co Ci funkcja, skoro nic do niej nie przekazujesz? Poczytaj sobie o obiekcie

 ostringstream 

jego metodzie str() i zastanów się jak Ci to może pomóc.

0
twonek napisał(a):

Pokaż deklaracje tablic liczby i tekst.

AnsiString tekst[15];

AnsiString liczby[10];

proszę

0
Kozi12 napisał(a):

Po co Ci funkcja, skoro nic do niej nie przekazujesz?
To po co są te wszystkie funkcje bezparametrowe w bibliotece standardowej?

@czarny Szczur: no to jest jeszcze bardziej bez sensu niż myślałem. Powiedz słowami, co robi każda linijka kodu w Twojej funkcji. I co Twoim zdaniem robi funkcja StrToInt?

0

@twonek Przypisuje wartość zmiennej tekst[0] do zmiennej liczby[0], następnie konwertuje liczby na int'a, a te return 0 to faktycznie bez sensu...

0

@Kozi12 Chodzi o to, że zżera za dużo pamięci?

0
Czarny Szczur napisał(a):

Przypisuje wartość zmiennej tekst[0] do zmiennej liczby[0]
Po co?

następnie konwertuje liczby na int'a
Nie, konwertujesz jedną literkę, bo skopiowałeś tylko pierwszą literkę z tekst. Poza tym nawet nie wiem czy to co jest w liczby to poprawny string. Do tego wynik konwersji znowu przypisujesz do pierwszego elementu liczby, czyli do zmiennej przechowującej 1 znak.

0

Ale dlaczego to jest błąd?

0

@Kozi12

Oto cały kod:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

AnsiString tekst[15];
AnsiString dodawanie_tekstu;

AnsiString liczby[10];

AnsiString przekazywanie_do_statictext()
{
dodawanie_tekstu = tekst[0]+tekst[1]+tekst[2]+tekst[3]+tekst[4]+tekst[5]
+tekst[6]+tekst[7]+tekst[8]+tekst[9]+tekst[10]+tekst[11]+tekst[12]+tekst[13]
+tekst[14];

    Form1->StaticText1->Caption = dodawanie_tekstu;

    return Form1->StaticText1->Caption;

}

int konwersja_stringow()
{
liczby[0] = tekst[0];

     liczby[0] = StrToInt(liczby[0]);

     return 0;

}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::jedenClick(TObject *Sender)
{
tekst[0] = " 1 ";

     konwersja_stringow();

    przekazywanie_do_statictext();

}
//---------------------------------------------------------------------------

void __fastcall TForm1::dwaClick(TObject *Sender)
{
tekst[1] = " 2 ";

    liczby[1] = tekst[1];

   przekazywanie_do_statictext();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::trzyClick(TObject *Sender)
{
tekst[2] = " 3 ";

    przekazywanie_do_statictext();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::czteryClick(TObject *Sender)
{
tekst[3] = " 4 ";

      przekazywanie_do_statictext();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::piecClick(TObject *Sender)
{
tekst[4] = " 5 ";

       przekazywanie_do_statictext();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::szescClick(TObject *Sender)
{
tekst[5] = " 6 ";

       przekazywanie_do_statictext();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::siedemClick(TObject *Sender)
{
tekst[6] = " 7 ";

      przekazywanie_do_statictext();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::osiemClick(TObject *Sender)
{
tekst[7] = " 8 ";

       przekazywanie_do_statictext();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::dziewiecClick(TObject *Sender)
{
tekst[8] = " 9 ";

       przekazywanie_do_statictext();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::zeroClick(TObject *Sender)
{
tekst[9] = " 0 ";

       przekazywanie_do_statictext();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::dodajClick(TObject *Sender)
{
tekst[10] = " + ";

       przekazywanie_do_statictext();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::odejmijClick(TObject *Sender)
{
tekst[11] = " - ";

        przekazywanie_do_statictext();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::pomnozClick(TObject *Sender)
{
tekst[12] = " * ";

       przekazywanie_do_statictext();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::podzielClick(TObject *Sender)
{
tekst[13] = " / ";

       przekazywanie_do_statictext();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::rowna_sieClick(TObject *Sender)
{
tekst[14] = " = ";

       przekazywanie_do_statictext();

}
//---------------------------------------------------------------------------

0
Czarny Szczur napisał(a):

Ale dlaczego to jest błąd?

W zmiennej tekst[0] siedzi "1" więc chyba powinno dobrze przekonwertować na int skoro to jest liczba?

0

@Craith Tak, ale po przekonwertowaniu na typ string jest wartością.

0

http://www.freepascal.org/docs-html/rtl/sysutils/strtoint.html

Dokumentacja napisał(a)

To be successfully converted, a string can contain a combination of numerical characters, possibly preceded by a minus sign (-). Spaces are not allowed.

Na dodatek ten kod jest straszny. Na każdą cyfre wystarczy jedna funkcja! Podpowiedź:

void __fastcall TForm1::cyfraClick(TObject *Sender)
{
     TButton *button = static_cast<TButton *>(Sender);
     AnsiString cyfra = button->Caption;
     // int wartosc = button->Tag; // wartosc Tag możesz dowolnie wykorzystywać

     StaticText1->Caption = StaticText1->Caption + cyfra; // tak powinieneś łaczyć tekst
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1