Niestety, dalej nie dziala :| Program sie sypie:
Abnormal program termination
:| Moze wiecej kodu cos wyjasni:
Konstruktor klasy wyglada teraz tak:
bignum(void)
{
*this = "0";
wartosc = 0;
}
Druga definicja operatora przypisania:
void operator = (bignum bbb) /*przypisanie drugiej zmiennej typu bignum*/
{
char *c = bbb.ToString();
if(wartosc)delete[] wartosc;
len = strlen(c);
wartosc = new int[len];
for(int i=0;i<len;i++)
{tmp = c[i];
wartosc[i] = atoi(&tmp);
}
}
Operator mnozenia:
bignum operator * (int mnoznik) /*mnozenie przez liczbe calkowita typu int*/
{bignum bgn;
bgn.len = lenght()+1;
bgn.wartosc = Iloczyn1(wartosc,mnoznik,lenght());
return bgn;
}
Iloczyn1 to funkcja mnozaca przez liczbe calkowita zwracajaca wynik w postaci tablicy liczb calkowitych.
Teraz mozna juz zdefiniowac mnozenie 2 liczb wielocyfrowych:
bignum operator * (bignum bg) /*mnozenie przez zmienna typu bignum*/
{bignum bgn; //wynik
int n = bg.lenght();
int m = lenght();
for(int i=n-1;i>=0;i--)
{
bgn = bgn+(*this)*bg.wartosc[i];
*this = *this*10;
}
return bgn;
}
Definicja operatora dodawania jest dosc dluga, wiec przytocze tylko fragment:
int *pierwsza;
int *druga;
int dl_pierwszej = lenght();
int dl_drugiej = bg.lenght();
int *wynik = new int[dl_pierwszej+1];
//druga liczba nie moze byc dluzsza od pierwszej
//jezeli jest dluzsza, zamieniamy liczby miejscami
if(dl_drugiej<=dl_pierwszej)
{pierwsza = new int[bg.lenght()];
druga = new int[lenght()];
pierwsza = wartosc; //tablice cyfr typu int zawierajace liczby do dodania
druga = bg.wartosc;
}
else
{
druga = new int[bg.lenght()];
pierwsza = new int[lenght()];
druga = wartosc; //tablice cyfr typu int zawierajace liczby do dodania
pierwsza = bg.wartosc;
dl_drugiej = lenght();
dl_pierwszej = bg.lenght();
}
//..................................dalej dodawanie
Zmienne pierwsza, druga i wynik tez powinienem chyba zwolnic w taki sam sposob?
I jeszcze operator potegowania:
bignum operator ^ (long int wykladnik) /*potegowanie liczby typu bignum*/
{
bignum bgn; //wynik
bgn = *this;
for(int i =1;i<wykladnik;i++)
{
bgn = bgn*(*this);
}
return bgn;
Jak widac, wszystko bardzo prosto napisane, ale nie wiem dlaczego nie moge zwolnic pamieci - po zakonczeniu obliczen powinno byc zajete tylko tyle pamieci, ile zajmuje wynik.