Ошибка сегментации при чтении вектора - PullRequest
6 голосов
/ 18 декабря 2010

в программе на c ++, когда я хочу прочитать вектор размером 2697806, я всегда получаю ошибку ошибки сегментации.Я испробовал все возможные способы его чтения:

void AUROC(vector<float> v) {
   ...
   for(std::vector<int>::size_type i = 0; i != v.size(); i++)
      if (v[i]>0) ++pos; else ++neg;

   for(std::vector<long>::size_type i = 0; i != v.size(); i++)
     if (v[i]>0) ++pos; else ++neg;

   for (vector<float>::iterator i=v.begin(); i!=v.end(); ++i)
     if (*i>0) ++pos; else ++neg;

   for (long i=0;i<=v.size();i++)
     if (v[i]>0) ++pos; else ++neg;

   for(int i=0;i<=v.size();i++)
     if (v[i]>0) ++pos; else ++neg;
}

...
int main(void) { 
    vector<float> scores;
    // put data in scores;
    AUROC(scores);
}

эта проблема никогда не возникает с векторами гораздо меньших размеров.Бест, Пегах

Ответы [ 5 ]

3 голосов
/ 18 декабря 2010

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

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

Векторные индексы начинаются с нуля. Если размер вектора равен 5, то допустимые индексы равны 0..4. Ваш код будет пытаться получить доступ к элементам 0 .. 5 , что является ошибкой "по одному" Я считаю, что ваше "исправление" размера стека просто маскирует другие реальные проблемы.

Кроме того, вы должны передавать вектор по ссылке, а не по значению. Вы в настоящее время копируете вектор, когда звоните AUROC(vector<float> v). Это медленная и экстравагантная трата памяти. Измените функцию на AUROC(vector<float> &v).

2 голосов
/ 18 декабря 2010

Когда вы вызываете вашу функцию как:

vector<float> scores;
// put data in scores;
AUROC(scores);

Вектор scores будет скопирован в стек.Вам не следует передавать такие большие коллекции данных (12 МБ) через стек, изменять код на ссылку или на передачу указателей.

Кроме того, вы можете проверять и изменять ограничения стека на своем хосте.В Unix:

ulimit -s 

напечатает текущую настройку предела стека.Вы можете изменить его на

ulimit -s size_in_kb

и проверить его после изменения

1 голос
/ 18 декабря 2010

Так как он работает для меньших размеров, я думаю, вам не хватает места в стеке.Как проверить пространство стека и изменить его, зависит от вашей ОС: В Linux запустите ulimit -s для проверки и ulimit -s SIZE для установки.

Дополнительная информация: http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/

0 голосов
/ 18 декабря 2010

Это:

for (long i=0;i<=v.size;i++)

должно быть:

for (long i=0;i<=v.size();i++)

и аналогичные в других местах.

0 голосов
/ 18 декабря 2010

Интересно, возможно, вы возитесь со стеком.

Оберните это

if (v[i]>0) ++pos; else ++neg;

в фигурные скобки.

{ if (v[i]>0) ++pos; else ++neg; }

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