доступ к случайному элементу двумерного вектора - PullRequest
0 голосов
/ 22 октября 2019

У меня проблемы с доступом к определенному элементу 2D-вектора.

У меня есть функция, которая инициализирует вектор bool размером 25x25 как true. Он передается в функцию с именем release_balls по ссылке. Вот код того, как каждый элемент был инициализирован:

for (int i = 0; i < 25; i++) //a nested for loop fills a 2D vector
{
    vector<bool> temp; //temp represents the rows of the vector, which pushed in create a 2D matrix
    for (int j = 0; j < 25; j++)
    {
        temp.push_back(b);
    }
    traps.push_back(temp); //push in rows to create 2D matrix
}

Однако я не могу получить доступ к конкретному элементу 2D-массива. Я сделал это, прежде чем использовать метод использования вектора [2] [3]. Когда я делаю это в этой программе, это дает мне ошибку сегментации (ядро сброшено), как будто я обращаюсь к части вектора, которая не была инициализирована. Как я уже сказал, я могу перебирать вектор в этой функции и распечатывать все просто отлично. Вот функция. Он успешно выполняет cout, а затем вызывает ошибку seg в строке cout << traps [1] [1]; </p>

unsigned release_balls(vector < vector < bool>>& traps, vector < unsigned >& ballCycles)
{
    int high = MAX_CYCLES;
    int low = MIN_CYCLES;
    unsigned numberOfBalls = 0;
    cout << "cout all elements, iterating thru" << endl;
    for (unsigned i = 0; i < traps.size(); i++)
    {
        for (unsigned j = 0; j < traps[i].size(); j++)
        {
            cout << traps[i][j];
        }
    }
    cout << "cout random access  element of the vector traps. " << endl;
    cout << traps[1][1];
    cout << "Before for loop" << endl;
    for (unsigned i = 0; i < ballCycles.size(); i++)  
    {
        if (ballCycles[i] > 0) 
        {
            ballCycles[i]--;
            if (ballCycles[i] == 0) //If the element in ball cycle is 0 that means it has come back down and landed on a trap. 
            {
                unsigned  row = rand() % GRID_SIZE;
                unsigned  col = rand() % GRID_SIZE;
                cout << "the first if satement is being executed in release_balls" << endl;
                cout << "randomly generated row is: " << row << endl;
                cout << "Randomly gen column is: " << col << endl;
                cout << "traps[rows][col] is :" << traps[row][col]; 
                cout << "hi " << endl;
                if (traps[row][col] == 1) //if the trap has not yet been sprung
                {   
                    cout << "if traps[row][col] == 1" << endl;
                    traps[row][col] = 0;
                    unsigned b1 = rand() % (high - low + 1) + low; //ball 1 is randomly assigned a number of cycles
                    unsigned b2 = rand() % (high - low + 1) + low; //ball 2 is randomly assigned a number of cycles
                    ballCycles.push_back(b1);
                    ballCycles.push_back(b2);
                    for (unsigned int i = 0; i < ballCycles.size(); i++)
                    {
                        cout << ballCycles[i] << ' '; 
                    }
                    cout << endl;
                }
            }
        }
        for (unsigned  i = 0; i < ballCycles.size(); i++)
        {
            if (ballCycles[i] != 0) //loop over vector and count the number of balls in air during this particular cycle
            {
                numberOfBalls++; 
            }
        }
    }
    return numberOfBalls;
}

Кроме того, я знаю, что двумерный вектор bools является плохой формой в C ++ 11, но этопредназначен для класса программирования, и назначение специально говорит, чтобы использовать это.

...