Operator> работает через раз

302
19 декабря 2016, 20:00

У меня есть класс 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;
}
Answer 1

Код

while(num[j] == t.num[j]){j--;}

неверен: что будет, когда вы дойдёте до нуля? (Ответ: undefined behaviour.)

Исправляйте.

Кстати, логика с проверкой знака (if (sign) ret=!ret;) у вас тоже не сработает.

READ ALSO
Гиперссылка в встроенном webBrowser

Гиперссылка в встроенном webBrowser

приветствую! ) Задача следующая: в программе (на visual C++ 2008) встроен веб-браузер, он используется для вывода информации (таблиц)Я хочу вывести...

268
Как исправить ошибку: error expected expression before

Как исправить ошибку: error expected expression before

Не обломался и вчитался :)

812
Немного запутался с вложенными циклами

Немного запутался с вложенными циклами

map[0][j] - сюда я пытаюсь вывести каждую цифру в 1й строчке в каждый отдельный столбик цифры должны выводиться от нуля до 9, но почему то не получаетсяесли...

307
Ftp клиент

Ftp клиент

Делаю лабораторную "ftp client" , когда посылаю серверу "LIST" , в массив приходит список папок и фалов ввиде : drwxrwxrwx 1 user group 11 May 10 23:12 !! Папка1drwxrwxrwx 1 user group 22 May 10 12:11 !! Песня1

323