Проблема доступа к 4d вектору - PullRequest
0 голосов
/ 26 августа 2011

У меня есть 4d вектор, и я пытаюсь добавить значения к нему. Я не получаю никаких ошибок компилятора, но при запуске программа зависает, когда попадает в строку, где я добавляю значения в этот вектор.

Я инициализирую вектор в заголовочном файле следующим образом:

std::vector<std::vector<std::vector<std::vector<unsigned int> > > > _celllist;

Размер массива затем изменяется следующим образом:

_celllist.resize(_vnx);
 for(int i=0;i<_vnx;i++) 
    {
        //y axis size
        _celllist[i].resize(_vny);
            for(int j=0;j<_vny;j++)
            {
                //z axis size
                _celllist[i][j].resize(_vnz);
            }
    }

Эта строка вызывает сбой программы:

_celllist[ix][iy][iz].push_back(i);

Обратите внимание, что ix, iy и iz являются int, а i - беззнаковым int.

Может кто-нибудь увидеть, что здесь может пойти не так? Спасибо

Ответы [ 4 ]

1 голос
/ 26 августа 2011

В предположении, я бы сказал, что вы делаете из-за пределов доступ к вашему массиву. Когда вы делаете _celllist[ix][iy][iz].push_back(i), это _celllist.size() > ix, это _celllist[ix].size() > iy, это _celllist[ix][iy].size() > iz? Если все эти вещи не соответствуют действительности, ваша программа не будет работать.

1 голос
/ 26 августа 2011

Оператор [] не расширяет и не гарантирует, что элемент действителен.Это более быстрая версия at () с небольшой проверкой или без проверки ошибок:

На данный момент конвертируйте ваш код в более безопасную версию:

_celllist.at(ix).at(iy).at(iz).push_back(i);

Этот новый код будетвыведите исключение out_of_range, если ваши индексы выключены.

1 голос
/ 26 августа 2011

Вы не можете сделать это, потому что celllist [ix] не существует, потому что ничего не было возвращено в него. Вы толкаете меня обратно к 4-му вложенному вектору, когда 4-й вложенный вектор должен содержаться как элемент как 3-й, как 2-й и т. Д.

Более четко

vector> v;

Я не могу сделать:

v[0].push_back(1);

Пока я не сделаю:

v.push_back(vector<int>());

Но теперь, когда я это сделал,

v[0]

на самом деле элемент v, который является самим вектором. Так что я могу получить к нему доступ и сделать толчок назад, как:

v[0].push_back(7);
0 голосов
/ 26 августа 2011

Ошибка, которую вы видите, вероятно, вызвана неограниченным доступом к вашим векторам. Обратите внимание, что std::vector::operator[] не проверяет границы! Хотя std::vector::at() делает.

std::vector, вероятно, не то, что вы хотите. Конечно, вы можете использовать вложенные std::vector, как это, но помните, что это не создаст 4d матрицы, как вы думаете. std::vector просто управляет динамическим массивом в непрерывной памяти.

Может быть, вы будете счастливее с простыми вложенными массивами C, например unsigned int[XDIM][YDIM][ZDIM].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...