Ошибка OGDF при любом вызове функции GraphAttributes

Я только начинаю с OGDF и пытаюсь освоить его, запустив некоторые примеры, которые находятся на веб-странице OGDF в разделе How-Tos.
Мой код компилируется, но происходит сбой при попытке вызвать функцию GraphAttributes на узле.

Вот мой код:

   ogdf::Graph G;
ogdf::GraphAttributes GA(G);

if (!ogdf::GraphIO::readGML(G, "sierpinski_04.gml") ) {
std::cerr << "Could not load sierpinski_04.gml" << std::endl;
return 1;
}ogdf::node v;

GA.setAllHeight(10.0);
GA.setAllWidth(10.0);

ogdf::FMMMLayout fmmm;

fmmm.useHighLevelOptions(true);
fmmm.unitEdgeLength(15.0);
fmmm.newInitialPlacement(true);
//fmmm.qualityVersusSpeed(ogdf::FMMMLayout::qvsGorgeousAndEfficient);

fmmm.call(GA);
ogdf::GraphIO::writeGML(GA, "sierpinski_04-layout.gml");

for(v=G.firstNode(); v; v=v->succ()) {
std::cout << v << std::endl;
//the following line causes the segfault
double xCoord = GA.x(v);
}

Если я закомментирую строку, которую я упомянул в комментарии, это вызывает segfault, то программа работает нормально без segfault.
Если я тогда загляну в записанный файл .gml, то у узлов будут координаты x и y.
Я получаю следующее сообщение:

MT: /home/work/lib/OGDF-snapshot/include/ogdf/basic/NodeArray.h:174: T& ogdf::NodeArray<T>::operator[](ogdf::node) [with T = double; ogdf::node = ogdf::NodeElement*]: Assertion `v->graphOf() == m_pGraph' failed.

Это также происходит, когда я вызываю другую функцию в GraphAttributes, например, .idNode (v).

Может ли кто-нибудь указать мне правильное направление, почему это происходит? Я абсолютно не понимаю, откуда это происходит, и OGDF слишком большой, чтобы просто пройтись по коду и понять его. (По крайней мере для меня)

Заранее большое спасибо!

2

Решение

К сожалению, вашу проблему нелегко воспроизвести.

Моя интуиция состояла бы в том, чтобы инициализировать GraphAttributes после загрузки Graph из файла.

ogdf::Graph G;
if (!ogdf::GraphIO::readGML(G, "sierpinski_04.gml") ) {
std::cerr << "Could not load sierpinski_04.gml" << std::endl;
return 1;
}
ogdf::GraphAttributes GA(G, ogdf::GraphAttributes::nodeGraphics |
ogdf::GraphAttributes::nodeStyle |
ogdf::GraphAttributes::edgeGraphics );

Или вызвать initAttributes после загрузки графика.

ogdf::Graph G;
ogdf::GraphAttributes GA(G);

if (!ogdf::GraphIO::readGML(G, "sierpinski_04.gml") ) {
std::cerr << "Could not load sierpinski_04.gml" << std::endl;
return 1;
}

GA.initAttributes(ogdf::GraphAttributes::nodeGraphics |
ogdf::GraphAttributes::nodeStyle |
ogdf::GraphAttributes::edgeGraphics);

Надеюсь, это помогает.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]