элемент доступа sparse_matrix, похоже, останавливает программу - PullRequest
0 голосов
/ 22 августа 2009

У меня странная ошибка, на которую, я надеюсь, опытный программист мог бы кое-что понять. Я использую разреженные матрицы boost ublas, в частности mapped_matrix, и в конечном итоге возникает непостоянная ошибка, но не на начальных этапах программы. Это большая программа, поэтому я не могу опубликовать весь код, но основная идея заключается в том, что я вызываю функцию, которая принадлежит определенному классу:

bool MyClass::get_cell(unsigned int i, unsigned int j) const
{
    return c(i,j);
}

Переменная c определена как член класса

boost::numeric::ublas::mapped_matrix<bool> c;

Когда возникает ошибка, программа, кажется, останавливается (но не падает). Отладка с Eclipse, я вижу, что программа вводит код boost mapped_matrix и продолжает несколько уровней вниз в std :: map, std :: _ Rb_tree и std :: less. Кроме того, программа иногда прослеживает до std :: map, std :: _ Rb_tree и std :: _ Select1st. Пока выполняется код и активная строка в памяти изменяется в _Rb_tree, выполнение никогда не возвращается на уровне std :: map. Строка в std :: map, на которой закреплена программа, является возвращением следующей функции.

const_iterator
find(const key_type& __x) const
{ return _M_t.find(__x); }

Мне кажется, что в матрице c есть какой-то элемент, который ищет программа, но каким-то образом лежащий в основе механизм хранения "потерял его". Однако я не уверен, почему или как это исправить. Это также может быть совершенно с базы.

Любая помощь, которую вы можете оказать, будет принята с благодарностью. Если я не включил правильную информацию в этот вопрос, пожалуйста, дайте мне знать, что мне не хватает. Спасибо.

Ответы [ 2 ]

1 голос
/ 22 августа 2009

Некоторые вещи, чтобы попытаться отладить код (не обязательно постоянные изменения):

  • Измените bool на int в типе матрицы для c, чтобы посмотреть, ожидает ли матрица числовых типов.
  • Измените тип матрицы на другой с аналогичным интерфейсом, возможно, просто старый matrix.
  • Valgrind приложение (если вы используете Linux), чтобы убедиться, что вы не повреждаете память.

Если это не помогло, вы можете попробовать вызывать get_cell каждый раз, когда изменяете матрицу, чтобы увидеть, что может быть причиной проблемы.

В противном случае вам, возможно, придется попытаться уменьшить проблему до гораздо меньшего подмножества кода, который вы можете опубликовать здесь.

Может помочь, если вы сообщите нам, какой компилятор и ОС вы используете.

0 голосов
/ 22 августа 2009

Является ли это частью многопоточной программы?

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

...