У меня есть класс 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;
) у вас тоже не сработает.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
приветствую! ) Задача следующая: в программе (на visual C++ 2008) встроен веб-браузер, он используется для вывода информации (таблиц)Я хочу вывести...
map[0][j] - сюда я пытаюсь вывести каждую цифру в 1й строчке в каждый отдельный столбик цифры должны выводиться от нуля до 9, но почему то не получаетсяесли...
Делаю лабораторную "ftp client" , когда посылаю серверу "LIST" , в массив приходит список папок и фалов ввиде : drwxrwxrwx 1 user group 11 May 10 23:12 !! Папка1drwxrwxrwx 1 user group 22 May 10 12:11 !! Песня1