2012-04-04 3 views
1

OSX 10.7, XCode 4.push_back вопрос станд :: вектор

У меня есть небольшая проблема: мне нужно нажать назад 2D vector<vector<float>> в к 3D Vector, после процесса отбора. Он выдает ошибку EXC_BAD_ACCESS в функции push_back в шаблоне stl :: vector. Кажется, что это должно быть просто (я много раз работал со сложными структурами данных), я пробовал разные идеи, но безуспешно. Все остальное работает и выводит значения, которые я ожидаю в командной строке. Я уверен, что его слепота кода, и некоторые легкие репутации подобрать.

Я прошу только потому, что считаю, что мой синтаксис верен, но во время компиляции у меня возникают проблемы. Heres некоторые примеры кода:

Реализация:

for(int i=0;i<fdisVec.size();i++){ 

    int j; 

     if(fdisVec[i] < fdisVec2[i]){ 

      j = 0; 

     } 

     else if(fdisVec2[i] < fdisVec[i]){ 

      j = 1; 

     } 

    clusters[j].push_back(allMfccs[i]); 

} 

и мой .h имеет объекты, объявленные как таковые (открытые члены класса):

vector< vector <float> > allMfccs; 
    vector< vector < vector <float> > > clusters; 

В случае помогает, fdisVec и fdisVec2 также являются 2d векторами, однако оператор «if else» отвечает, как я этого хочу, - я очень сомневаюсь, что это было бы чем-то связано с этим.

+0

Если вы имеете дело с vecs vecs поплавков, вы можете захотеть использовать матричный тип, например boost :: numeric :: ublas :: matrix. Он имеет интерфейс STL. Попробуйте использовать .at() вместо [] и посмотреть, не возникло ли возникшее исключение. – 111111

+0

Каковы размеры? У вас не хватит памяти? –

+0

Если значения равны, 'j' не инициализируется. – hmjd

ответ

1

Что делать, если fdisVec [i] == fdisVec2 [i]?

В этом случае j остается неинициализированным (мусор), а иногда значение не является допустимым индексом для вашего вектора кластеров.

+0

Просто попробовал изменить if, если только a if (fdis

+0

Какова ценность clusters.size()? allMfccs.size()? fdisVec.size()? –

+0

allMfccs.size() = 2998, fdisVec.size() = 2998, clusters.size() = 0. Я еще не использовал кластеры, этот цикл относится к процессу заполнения этого 3D-вектора правильно. –

1

Несмотря на то, что проблема cluster.size() == 0 будет проблемой (как описано в ответе @VaughnCato), доступ к элементу кластера не приведет к ошибке времени компиляции, но, скорее всего, сбой вашей программы при ее запуске.

Однако ошибка времени компиляции происходит из-за того, что clusters[j] ожидающей vector< vector<float> > но allMfccs[i] является лишь vector<float>.

Таким образом, согласно вашему заявлению clusters и allMfccs, вам необходимо нажать allMfccs.

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