2016-09-23 5 views
-1

Я пытаюсь решить эту проблему problem. Я написал этот код:Ошибка поиска в моем коде: C++

#include <iostream> 
#include <vector> 
using namespace std; 

int findIndex(x, lastAns, N) { 
    return ((x == !lastAns) % N); 
} 

void query_1(int x, int y, int N, int lastAns, std::vector< std::vector<int> >& v) { 

    v[findIndex(x, lastAns, N)].push_back(y); 

} 

void query_2(int x, int y, int N, int* lastAns, std::vector< std::vector<int> >& v) { 

    *lastAns = y % (v[findIndex(x, *lastAns, N)].size()); 
    cout << *lastAns << endl; 

} 

int main(int argc, char const *argv[]) 
{ 

    int N, Q; 
    cin >> N >> Q; 

    std::vector< std::vector<int> > v; 
    std::vector<int> buff; 
    int queryType; 
    int lastAns = 0; 
    int x, y; 

    for(int i=0; i<N; ++i) { 
     for(int j=0; j<N-1; ++i) { 
      buff.push_back(0); 
     } 

     v.push_back(buff); 

    } 

    for(int i=0; i<Q; ++i) { 
     cin >> queryType; 
     cin >> x >> y; 

     if(queryType == 1) { 
      query_1(x, y, N, lastAns, v); 
     } 

     else if (queryType == 2) { 
      query_2(x, y, N, &lastAns, v); 
     } 

     else continue; 
    } 

    return 0; 
} 

Ошибки я получаю:

terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc

Я нету наткнулся на эту ошибку раньше. Когда я запускаю код через gdb, я получаю следующее:

Program received signal SIGABRT, Aborted. 
0x00007ffff74ab418 in __GI_raise ([email protected]=6) 
    at ../sysdeps/unix/sysv/linux/raise.c:54 
54 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory. 

В чем проблема с моим кодом?

+1

Кто-то предложит вам использовать debbuger рано или поздно ... – xinaiz

+1

Есть ли какая-то особая причина использования уродливого макроса вместо нормальной или шаблонной функции? – Slava

+0

Нет причин. Я просто подумал о достаточно простых вычислениях, достаточно было бы макроса. –

ответ

3

Примечание:

for(int i=0; i<N; ++i) { 
     for(int j=0; j<N-1; ++i) // <<<<<< some little mouse got here 

EDIT:

Объяснение: Вы создали бесконечный цикл, где j<N-1 всегда true. Это означает, что вы вставляете новые элементы в вектор до тех пор, пока не будет доступно больше памяти, следовательно, ошибка времени выполнения.

+2

Да, ответит на вопрос «В чем проблема в моем коде?» – xinaiz

+0

Возможно, вам стоит сделать это более понятным? – Slava

+0

Yup, который удалил ошибку bad_alloc. Спасибо за объяснение. –

0

Эта функция может быть причиной ошибки:

int findIndex(x, lastAns, N) { 
    return ((x == !lastAns) % N); 
} 

Во-первых, параметры отсутствуют их типы.

Далее, выражение

!lastAns 

будет вычисляться к нулю или не равно нулю. Это означает, что вы сравниваете целое число, x, с нулевым или ненулевым значением: (x == 0) or (x == 1)
Результат приведенных выше выражений равен нулю или не равен нулю. Предположим, что 1 для ненулевого. Вы получаете окончательное выражение

`return 0 % N;` or `return 1 % N`; 

Окончательное возвращаемое значение равно 0 или 1. Переменная N не имеет значения, потому что только существенные значения 0 или 1. Вы не можете иметь N как ноль (который вы не проверять), и когда N равно 1, вы все равно получите 0 или 1.

Так ваше выражение:

v[findIndex(x, lastAns, N)] 

v[0] будет или `v [1].

+0

Недопустимые параметры параметров функции были результатом плохого редактирования вопроса. Раньше это был макрос. – xinaiz

Смежные вопросы