2014-01-26 3 views
0

Так что я вставляю кучу значений в вектор (я пробовал карту с теми же результатами), и я продолжаю получать ошибку сегментации на моем втором векторе, который является VectorMin , Я пробовал раскомментировать это, и если я работаю только с VectorMax, все отлично работает.C++ - ошибка сегментации при вставке в карту или вектор

По какой-то причине, если я попытаюсь манипулировать обоими векторами, я получу ошибку сегментации. Если я раскомментирую один, программа загрузится правильно.

Я использую файл 3.5mb с 1000 строками и 362 значениями для каждой строки.

std::vector<float> vectorMax, vectorMin; 

void Parser::isMaxMinVector(float value, int index){ 

    //if the index of the vector is not yet used 
    if (index >= vectorMax.size()){ 
     vectorMax.push_back(value); 
    } 

    if(index >= vectorMin.size()){ 
     vectorMin.push_back(value); 
    } 

    //if new vector is larger, then overwrite it 
    //if(vectorMax[index] > value) vectorMax[index] = value; 
    //if(vectorMin[index] < value) vectorMin[index] = value; 
} 


void Parser::parseLine(char* line){ 
    std::vector<float> vectors; 
    char* point; 

    char* tk1 = strtok(line, ","); 
    char* tk2 = strtok(NULL, ","); 

    int i=0; 

    if(tk1 == NULL || tk2 == NULL) return; 

    float x = strtof(tk1, NULL); 
    float y = strtof(tk2, NULL); 

    XYPair pair = XYPair(x, y); 
    isMaxXY(x,y); 

    while(point=strtok(NULL, ",")){ 
     //convert the token to float 
     float f_point = strtof(point, NULL); 
     //push the float to the vector 
     vectors.push_back(f_point); 
     isMaxMinVector(f_point, i); 
     i++; 
    } 
} 
+0

Код, который вы показали, не будет скомпилирован, потому что класс std :: vector не имеет счетчика членов-членов. –

+0

Извините, я не отменил код достаточно далеко. Это мой код, который компилируется просто отлично. –

ответ

0

У вас есть размер векторов, чтобы у них было достаточно места для хранения? Оператор IIRC [] не изменяет размер, его неопределенное поведение, если в этом элементе нет значения. Если вы хотите что-то редкое, вам придется использовать что-то вроде карты.

1

Вы несколько раз меняли код своего сообщения. Тем не менее этот фрагмент кода

if (index >= vectorMax.size()){ 
    vectorMax[index] = value; 
} 

недействителен, так как вы используете несуществующий элемент с индексом> = size(). Я думаю, что вы имели в виду

if (!vectorMax.empty() && index < vectorMax.size()){ 
    vectorMax[index] = value; 
} 

Или примените функцию члена изменить размер. Например,

if (index >= vectorMax.size()){ 
    vectorMax.resize(index + 1); 
    vectorMax[index] = value; 
} 
+0

Да, я сделал изменения. Я пытаюсь сделать следующее: если индекс не соответствует текущему вектору, я хочу нажать новое значение в индексе, переданном функции. В противном случае мой код ниже (который я прокомментировал для целей тестирования) проверяет определенные условия и может или не может переопределять существующее значение по определенному индексу. –

+0

В этом случае вы должны использовать изменение размера члена. –

+0

Я пробовал это уже без успеха. То есть, когда я пробовал просто использовать push_back, и это тоже не сработало. –

0

Я думаю, что Влад из Москвы ответил, как показано ниже. Правильно ли это работает?

if (index >= vectorMax.size()){ 
     vectorMax[index] = value; 
    } 
0

Если вы не трогайте векторы в другом месте, это будет работать:

//if the index of the vector is not yet used 
if (index >= vectorMax.size()){ 
    vectorMax.push_back(value); 
    // update index here: 
    index = vectorMax.size(); 
} 

if(index >= vectorMin.size()){ 
    vectorMin.push_back(value); 
    // and here: 
    index = vectorMax.size(); 
} 
//if new vector is larger, then overwrite it 
if(vectorMax[index] > value) vectorMax[index] = value; 
if(vectorMin[index] < value) vectorMin[index] = value; 

Проблема об этом, однако, заключается в том, что в случае изменения индекса index значение не будет обновляться. Вы можете изменить это, используя int &index в вставленной подписи. Для этого подход Владимира намного лучше. С другой стороны, неясно, что содержат другие элементы в векторах (если вы могли бы создавать артефакты, например).

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