Автор Тема: Найдите ошибку, если она есть.  (Прочитано 33797 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Найдите ошибку, если она есть.
« : Сентябрь 14, 2016, 08:40:16 pm »
Имеем вот такой код на С++:

#include <vector>
#include <iostream>

using namespace std;

struct bor
{
    int mp[2];
    int cnt;
    bor(): mp({0,0}), cnt(0)
    {}
};
vector<bor> tr;
int go()
{
    tr.push_back(bor());
    cerr << "go " << tr.size() << ' ' << tr.size() - 1 << endl;
    return tr.size() - 1;
}

string s;
int add(int v, int i, int zn)
{
    cerr << "in " << v << ' ' << tr.size() <<' ' << i <<' ' << s.size() << endl;
    if (i == static_cast<int>(s.size()))
    {
        tr[v].cnt += zn;
        return tr[v].cnt;
    }
    int x = s[i] - '0';
    x = x % 2;
    if (tr[v].mp[x] == 0)
    {
       cerr << "go in " << endl;
       cerr << tr.size() <<' ' << tr[v].mp[x] << endl;
         tr[v].mp[x] = go();
       cerr << tr.size() <<' ' << tr[v].mp[x] << endl; 
         cerr << "go out " <<  endl;
    }
    return add(tr[v].mp[x], i + 1, zn);
}

int main()
{
    go();
    s = "01";
    add(0, 0, 1);
}

Найдите в коде ошибку, если она есть. Что делает программа вам знать не нужно, нужно чтобы программа успешно завершила работу.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Найдите ошибку, если она есть.
« Ответ #1 : Сентябрь 14, 2016, 08:42:45 pm »
Ну и дополнительный вопрос: могла ли возникнуть подобная ситуация в вашем любимом ЯП в аналогичном коде (если на вашем любтмом ЯП аналогичный код не пишут, ибо ЯП сильно другой, то это не считается).
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Найдите ошибку, если она есть.
« Ответ #2 : Сентябрь 15, 2016, 07:53:54 am »
Программа скомпилялась, значит ошибок нет (алгоритм же не указан, значит любой алгоритм правилен).
Хотя есть сообщение о предупреждении:

10:28: warning: list-initializer for non-class type must not be parenthesized

Ну хз...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Найдите ошибку, если она есть.
« Ответ #3 : Сентябрь 15, 2016, 11:05:51 am »
Программа скомпилялась, значит ошибок нет (алгоритм же не указан, значит любой алгоритм правилен).
Это в цитатник! :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Найдите ошибку, если она есть.
« Ответ #4 : Сентябрь 15, 2016, 11:06:40 am »
Напомню, что программа как минимум не должна падать. Пользователь собирает программу gcc.
Y = λf.(λx.f (x x)) (λx.f (x x))

kemiisto

  • Jr. Member
  • **
  • Сообщений: 64
    • Просмотр профиля
    • kemiisto.ru
Re: Найдите ошибку, если она есть.
« Ответ #5 : Сентябрь 15, 2016, 12:04:55 pm »
Что тут у нас? Geniepro открывает для себя новый вид ошибок: ошибки времени исполнения?  :D  Падает оно, да. Разбираться лень. ;D

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Найдите ошибку, если она есть.
« Ответ #6 : Сентябрь 15, 2016, 12:15:37 pm »
Что тут у нас? Geniepro открывает для себя новый вид ошибок: ошибки времени исполнения?  :D  Падает оно, да. Разбираться лень. ;D
Он пришел из страны непуганных хаскелистов. :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Найдите ошибку, если она есть.
« Ответ #7 : Сентябрь 15, 2016, 04:50:42 pm »
Что тут у нас? Geniepro открывает для себя новый вид ошибок: ошибки времени исполнения?  :D  Падает оно, да. Разбираться лень. ;D
У меня не упало. Проверял онлайн-компилятором с сайта cpp.sh, возиться с установкой с++ компилеров лень, а борландовскому сибилдеру 2001 года я не очень доверяю проверку этой программы ))...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Найдите ошибку, если она есть.
« Ответ #8 : Сентябрь 15, 2016, 04:58:07 pm »
Кто-то ещё хочет попытаться? :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Найдите ошибку, если она есть.
« Ответ #9 : Сентябрь 15, 2016, 05:02:57 pm »
Поставил дома CodeBlock с GCC -- прога и правда падает )))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Найдите ошибку, если она есть.
« Ответ #10 : Сентябрь 15, 2016, 05:06:23 pm »
хз что там за ошибка, но одно могу сказать точно -- это тебе наказание за то, что говнокодишь всякую императивщину )))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Найдите ошибку, если она есть.
« Ответ #11 : Сентябрь 15, 2016, 05:08:51 pm »
хз что там за ошибка, но одно могу сказать точно -- это тебе наказание за то, что говнокодишь всякую императивщину )))

Это не мой код :-) Просто у знакомые столкнулись с вот этим. Помог багу отловить.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Найдите ошибку, если она есть.
« Ответ #12 : Сентябрь 15, 2016, 05:21:09 pm »
Ну как минимум вот в этой строке:

int x = s[i] - '0';
у тебя x становится отрицательной, когда i становится равной 2 и из строки s ты считываешь терминатор строки (число ноль).
Далее в строке:

Цитировать
if (tr[v].mp
  • == 0)
у тебя происходит обращение к элементу вектора tr с отрицательным индексом, это, видимо, и приводит к падению программы.

Не показывай такой говнокод своему работодателю -- он будет обязан уволить тебя )))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Найдите ошибку, если она есть.
« Ответ #13 : Сентябрь 15, 2016, 05:22:45 pm »
Что-за глюки у движка этого форума???
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Найдите ошибку, если она есть.
« Ответ #14 : Сентябрь 15, 2016, 05:24:03 pm »
Ну как минимум вот в этой строке:
int x = s[i] - '0';у тебя x становится отрицательной, когда i становится равной 2 и из строки s ты считываешь терминатор строки (число ноль).
Далее в строке:
if (tr[v].mp[x] == 0)у тебя происходит обращение к элементу массива mp с отрицательным индексом, это, видимо, и приводит к падению программы.

Не показывай такой говнокод своему работодателю -- он будет обязан уволить тебя )))

ЗЫ. Накапай работодатюлю своих знакомых -- пусть их уволят )))
« Последнее редактирование: Сентябрь 15, 2016, 05:25:46 pm от Geniepro »
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…