2014-03-05 3 views
6

Ich versuche, eine Variable aus einer externen Bibliothek in C++, Visual Studio 2010 zu definieren. Es funktioniert nur, wenn ich es außerhalb der Hauptfunktion ablegen.C++ - Probleme beim Definieren einer Variablen innerhalb der Funktion main()

Dieser Code stürzt:

#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; 
} 

Es gibt mir eine unhandheld Ausnahme: Zugriffsverletzung. Wenn es jedoch außerhalb Hauptfunktion ist, funktioniert es ohne Probleme:

#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; 
} 

Haben Sie, wie kann ich das Problem lösen? Ich nehme an, dass es durch irgendeine Art von Verknüpfungsproblem verursacht wird.

EDIT: Es sieht aus wie das Problem ist nicht die Initialisierung der Variablen. Es wird eine Ausnahme ausgelöst, wenn die Anwendung beendet wird.

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; 

}

Bezeichnen Sie Stapel: Call STack

Die Ausgabe lautet: Erste-Chance-Ausnahme bei 0x0126788f in graphs.exe: 0xC0000005: Zugriffsverletzung Schreibort 0x00000000.

Unbehandelte Ausnahme bei 0x0126788f in Grafiken.exe: 0xC0000005: Zugriffsverletzung beim Schreiben der Position 0x00000000.

+4

Es hat wahrscheinlich etwas damit zu tun, dass globale Variablen Null initialisiert werden, während lokale Variablen unbestimmte Werte haben.Was passiert, wenn Sie 'g' explizit initialisieren, wenn es lokal deklariert wird? –

+2

@JoachimPileborg: aber ogdf :: Graph ist eine Klasse und der Konstrukteur macht hoffentlich die Initialisierung. Dokumentation ist [hier] (http://www.ogdf.net/doc-ogdf/classogdf_1_1_graph.html) –

+1

Können Sie auch den Stack-Dump posten. Es wäre interessant ** wo ** die Ausnahme ausgelöst wird und aufgrund welcher Adresse. – Flovdis

Antwort

5

Funktioniert an meiner Maschine ™.

Esoterische Fehler wie diese sind oft eine Folge von binärer Inkompatibilität. Aufgrund unterschiedlicher Compiler/Präprozessor-Optionen sind effektive Header, die Ihr Code und die Bibliothek "sehen", unterschiedlich.

Zum Beispiel, wenn Sie eine Bibliothek mit folgenden Header-Code haben:

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

Bibliotheksfunktion:

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

und Client-Code:

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

Wenn FOO_DEBUG ist nicht in Synchronisierung zwischen Client und der Bibliothek, dies wird möglicherweise abstürzen und brennen - variable wird einen unterschiedlichen erwarteten Offset haben.

In Ihrem Fall vermute ich, eine der folgenden Bedingungen erfüllt sein:

  • Sie die OGDF mit anderen Compiler gebaut haben, als Ihr Code
  • Wenn nicht, Sie OGDF und Ihr Code unterschiedliche Build-Konfigurationen (Release vs Debug)
  • Beide debuggen, aber Sie haben definiert OGDF_DEBUG (als here empfohlen)
  • Sie haben verschiedene "Struct Mitglied Alignment" Einstellung