000
21.09.2014, 13:09 Uhr
Paulchen29
|
Hallo Community,
ich sitze gerade über ein Problem, bei dem ich nicht mehr so richtig weiter weiß. Kurz zu meinen Kenntnissen zu C++: Naja Komme eigentlich von C#. Aber muss jetzt ein Projekt eines ehemaligen Kollegen übernehmen. Es ist ein Zusatzprogramm für AutoCAD basierend auf der ObjectARX.
Ich habe ein Projekt vom VS 2010 in das VS 2012 übernommen und ich vermute sehr stark, da ist etwas bei den Projekteinstellungen verloren gegangen.
Es geht um den Funktions - Aufruf RemoveAt(int i) der Klasse CArray. Das ist mein Code:
C++: |
for(int i = platArr.GetCount()-1; i >= 0; i--) { DiDbPolyline& poly = platArr.GetAt(i); double umfang = poly.Laenge(); double flaeche = poly.Flaeche(); if(*(fugepruef) == 'J') { double fuge = umfang/4. - sqrt(umfang*umfang/16.-flaeche); if(fuge < 1.1*fugesoll) { errArr.Add(poly); platArr.RemoveAt(i); continue; } } if(*(minmaxpruef) == 'J') { if(flaeche < minflaeche) { errArr.Add(poly); platArr.RemoveAt(i); continue; } if(flaeche > maxflaeche) { errArr.Add(poly); platArr.RemoveAt(i); continue; } } }
|
Also im VS 2010 (auch im VS 2008) funktioniert dies alles wunderbar - nur in meinem Projekt (unter VS 2012) steigt das Programm beim Aufruf von
C++: |
platArr.RemoveAt(i);
|
aus.
Zitat: |
Unbehandelte Ausnahme bei 0x000007FEEE3D397A (accore.dll) in acad.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x0000005200450061
|
Wenn ich mir jetzt die Deklaration bzw. Definition von RemoveAt ansehe, sehe ich dass zwei INT_PTR als Parameter übergeben werden.
C++: |
RemoveAt(INT_PTR nIndex, INT_PTR nCount)
|
Gehe ich nun zur Definiton von INT_PTR stelle ich einen großen unterschied zwischen beiden Projekten fest. In meinem Projekt wird _WIN64 vom Präcompiler angesehen - während dessen bei den anderen Projekten das "ELSE" als definiert angesehen wird.
C++: |
#if defined(_WIN64) typedef __int64 INT_PTR, *PINT_PTR; typedef unsigned __int64 UINT_PTR, *PUINT_PTR; typedef __int64 LONG_PTR, *PLONG_PTR; typedef unsigned __int64 ULONG_PTR, *PULONG_PTR;
#define __int3264 __int64
#else typedef _W64 int INT_PTR, *PINT_PTR; typedef _W64 unsigned int UINT_PTR, *PUINT_PTR; typedef _W64 long LONG_PTR, *PLONG_PTR; typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;
#define __int3264 __int32
|
Und wenn ich beim Debuggen in RemoveAt gehe, wird i in meinem Projekt mit einem Wert von 3 belegt (was ja theoretisch der richtige Index des Arrays ist, welcher entfernt werden soll) - während dessen bei den anderen Projekten dieser Wert beispielsweise = 886968493 ist. (ich vermute dies ist die korrekte Adresse)
Ich hoffe Ihr könnt mir dabei irgendwie helfen, was falsch läuft. Wie gesagt ich lerne noch C++!
Wenn Ihr noch weitere Fragen habt, um das Problem genauer eingrenzen zu können - würde ich mich freuen diese zu beantworten.
PS1: Die Projekt - Einstellungen habe ich überprüft und ich kann keinen sichtlichen Unterschied erkennen - auch im VS 2010 ist bspw. unter den Präcompiler Einstellung WIN64 definiert
PS2: Ich habe jetzt mal spaßeshalber RemoveAt(i) zwei Parameter mit gegeben (also auch den nCounter) - aber dies wieder zurück genommen. Wenn ich jetzt debugge hält nicht mehr mal der Compiler an dieser Stelle an sondern "hüpft" direkt weiter - was ist denn da jetzt kaputt? (habe VS 2012 neugestartet und das Projekt neu erstellt) |