У меня есть класс Lint "длинное целое число", вмещающее в себя целое число любой длины. Хранит он его в виде массива char, в каждом элементе массива содержится 2 разряда, но это не суть В классе, помимо прочего, описан operator>, который, очевидно, определяет, больше одно число другого или нет. Так вот, этот код работает:
string t,r;
cin >> t;
Lint ln (t);
ln.show();
cin >> r;
Lint lm(r);
int a;
cout << (lm>ln) << endl;
А этот нет, выдает ошибку, когда доходит до последней строки:
string t,r;
cin >> t;
Lint ln (t);
ln.show();
cin >> r;
Lint lm (r);
cout << (lm>ln) << endl;
Заметьте, я всего лишь убрал объявление переменной int a, которая вообще никаким боком не касается ни lm, ни ln, ни самого класса Lint.
Объясните, что здесь может быть не так, я уже отчаялся понять что-либо.
UPD: код Lint::operator>
bool Lint::operator> (Lint t)
{
bool ret;
if (!sign && t.sign) return 1;
else{
if (sign && !t.sign) return 0;
else{
if (size==t.size){
int j = size-1;
while(j >= 0 && num[j] == t.num[j]){j--;}
if (j == -1) return 0;
else{
int b1 = (int)num[j];
int h1 = b1 & 15;
int g1 = (b1 >> 4) & 15;
int c1 = g1*10+h1;
int b2 = (int)t.num[j];
int h2 = b2 & 15;
int g2 = (b2>>4) & 15;
int c2 = g2*10+h2;
if (c1 > c2) ret = 1;
else ret = 0;
}
}
else{
if (size > t.size) ret = 1;
else ret = 0;
}
if (sign) ret=!ret;
}
}
}
Цифры хранятся в cимвольном массиве num, по 2 цифры в одном элементе, по одной в каждой половине байта.
UPD 2: ошибка в итоге решилась переписыванием функции operator>. Я сделал ее отдельной от класса Lint и объявил ее другом класса.
Сама функция:
bool operator> (xlInt& r, xlInt& t)
{
bool ret;
if (!r.sign && t.sign) return 1;
else{
if (r.sign && !t.sign) return 0;
else{
if (r.size == t.size){
int j = r.size-1;
while(j >= 0 && num[j] == t.num[j]){j--;}
if (j == -1) return 0;
else{
int b1 = (int)num[j];
int h1 = b1 & 15;
int g1 = (b1 >> 4) & 15;
int c1 = g1*10+h1;
int b2 = (int)t.num[j];
int h2 = b2 & 15;
int g2 = (b2>>4) & 15;
int c2 = g2*10+h2;
if (c1 > c2) ret = 1;
else ret = 0;
}
}
else{
if (r.size > t.size) ret = 1;
else ret = 0;
}
if (r.sign) ret=!ret;
}
}
return ret;
}
Код
while(num[j] == t.num[j]){j--;}
неверен: что будет, когда вы дойдёте до нуля? (Ответ: undefined behaviour.)
Исправляйте.
Кстати, логика с проверкой знака (if (sign) ret=!ret;) у вас тоже не сработает.
Продвижение своими сайтами как стратегия роста и независимости