Возникли проблемы с определением переменной внутри функции main ()

Я пытаюсь определить переменную из внешней библиотеки в C ++, Visual Studio 2010. Она работает только тогда, когда я помещаю ее вне основной функции.

Этот код вылетает:

#include "StdAfx.h"#include <ogdf\basic\Graph.h>
#include <ogdf\basic\graph_generators.h>

int main()
{
ogdf::Graph g;
ogdf::randomSimpleGraph(g, 10, 20);
return 0;
}

Это дает мне необъяснимое исключение: нарушение доступа.
Однако, если он находится за пределами основной функции, он работает без проблем:

#include "StdAfx.h"#include <ogdf\basic\Graph.h>
#include <ogdf\basic\graph_generators.h>

ogdf::Graph g;

int main()
{
ogdf::randomSimpleGraph(g, 10, 20);
return 0;
}

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

РЕДАКТИРОВАТЬ: похоже, проблема не в инициализации переменной. Выдает исключение при выходе из приложения.

int main()
{
ogdf::Graph g; // No problem
ogdf::randomSimpleGraph(g, 10, 20); // No problem
int i; // No problem
std::cin>>i; // No problem
return 0;    // Throws an exception after read i;

}

Стек вызовов: Стек вызовов

Выход:
Исключение первого шанса в 0x0126788f в файле graphs.exe: 0xC0000005: место записи нарушения прав доступа 0x00000000.

Необработанное исключение в 0x0126788f в graphs.exe: 0xC0000005: Место записи нарушения прав доступа 0x00000000.

6

Решение

Работает на моей машине ™.

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

Например, если у вас есть библиотека со следующим кодом заголовка:

class Foo
{
#ifdef FOO_DEBUG
int debug_variable;
#endif
int variable;
};

Функция библиотеки:

void bar(Foo& foo)
{
std::cout << foo.variable;
}

И код клиента:

Foo foo;
foo.variable = 666;
bar(foo);

Если FOO_DEBUG не синхронизируется между клиентом и библиотекой, это может привести к сбою и сбою — variable будет иметь другое ожидаемое смещение.

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

  • Вы создали OGDF с другим компилятором, чем ваш код
  • Если нет, то вы ogdf и ваш код имеют разные конфигурации сборки (Release vs Debug)
  • Оба отлажены, но вы определили OGDF_DEBUG (как рекомендовано Вот)
  • У вас есть другая настройка «Выравнивание элементов Struct»
5

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

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

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