Я пишу программу на c ++, которая должна генерировать графики и вычислять некоторые показатели. Я работаю с Visual Studio 2013 и библиотекой Igraph C. На этом этапе я могу создавать графики из пользовательской информации и вычислять некоторые метрики, такие как между значениями центральности и близости, но когда я пытаюсь вычислить центральность собственного вектора, происходит сбой программы и отображается следующее сообщение:
«Ошибка проверки времени выполнения № 3 — переменная ‘tgetv0’ используется без инициализации.»
Переменная tgetv0 используется внутри dgetv.c из источника Igraph.
Вот мой код:
void GraphObject::calcEigen()
{
igraph_arpack_options_t options;
igraph_real_t value;
igraph_vector_t weights;
igraph_vector_init(&weights, igraph_ecount(&cGraph)); //cGraph is already created.
igraph_vector_init(&eigenRes, igraph_vcount(&cGraph)); //All ..Res igraph_vector_t are declarated in header
igraph_vector_init(&betweennesRes, 0);
igraph_vector_init(&closenessRes, 0);
igraph_arpack_options_init(&options);
igraph_betweenness(&cGraph, &betweennesRes, igraph_vss_all(), 0, 0, 1);
igraph_closeness(&cGraph, &closenessRes, igraph_vss_all(), IGRAPH_ALL, 0, 1);
igraph_eigenvector_centrality(&cGraph, &eigenRes, &value, 0, 1, &weights, &options);
}
Близость и правильность рассчитываются правильно, но они приводят к падению функции собственного вектора.
После многих исследований документации, интернета и отладчика я не могу понять, в чем проблема, особенно когда я попробовал пример кода в документации http://igraph.org/c/doc/igraph-Structural.html#igraph_eigenvector_centrality (копировать / вставить) и делает то же самое. Это проблема с библиотекой или примером, я что-то упустил?
Когда я инициализирую вектор весов, а затем вызываю igraph_null (&веса), это работает, но результат всех собственных значений равен 1, и это неверный результат. Что я делаю не так?
Давайте предположим, что Visual Studio прав, и у нас действительно есть переменная с именем tgetv0
который используется неинициализированным. Я отсканировал исходный код igraph, и похоже, что есть два места, где это действительно может быть. Один из них находится в src/lapack/dnaupd.c
другой находится в src/lapack/dsaupd.c
, Оба эти файла были конвертированы из Фортрана с помощью f2c
поэтому трудно сказать, присутствовала ли проблема в исходном коде Фортрана или была ли она введена во время преобразования. В любом случае, вы можете легко это исправить, посмотрев вверх tgetv0
объявлен в src/lapack/dnaupd.c
а также src/lapack/dsaupd.c
и инициализация его значением 0. В моей версии строки для изменения — это строка 486 в src/lapack/dnaupd.c
и строка 482 в src/lapack/dsaupd.c
,
Пожалуйста, добавьте комментарий, чтобы подтвердить, работает ли решение для вас или нет — если оно будет работать, я добавлю патч к исходному дереву igraph.