Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Präprozessor Makro _WIN64 - CArray

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.09.2014, 02:15 Uhr
Hans
Library Walker
(Operator)


Hi,

ich vermute mal, dass VS 2008 und VS 2010 an der Stelle mit 32Bit-Zahlen arbeiten, denn in dem Listing der Definition von _WIN64 steht ja in der #define- Zeile:

C++:
#if defined(_WIN64)
    ...    
    #define __int3264   __int64

#else
    ...
    #define __int3264   __int32    



Das verstehe ich so, dass im ersten Fall wirklich mit 64 Bit gearbeitet wird, während im zweiten Fall nur so getan wird, tatsächlich aber mit 32 Bit gearbeitet wird. Ob das jedoch wirklich so ist, müsstest Du mit den Debuggern von VS 2008 bzw. VS 2010 überprüfen.

Ansonsten fällt mir nur noch ein, alle Projekteinstellungen auch manuell zu überprüfen. Sofern diese in XML-Dateien gespeichert sind, diese Zeilenweise durchgehen und vergleichen, oder sonst das Projekt jeweils in VS 2008 / 2010 und in VS 2012 öffnen und die Einstellungen in den einzelnen Menüs/Reitern vergleichen. - Ist beides mühseelig, weis ich, aber was besseres fällt mir gerade nicht ein. - Doch: sofern die Einstellungen in XML-Dateien liegen, könnte man sie auch mit einem kurzen Skript oder in einem geeigneten Editor vergleichen. Das dürfte schneller gehen.

Soweit mal meine 2 cent,
Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.09.2014, 22:45 Uhr
ao

(Operator)


Google doch mal, ob es noch andere Leute gibt, die derartige Probleme haben (Übernahme von Projekten von VS2010 nach 2012, merkwürdige Fehler mit int32 und int64, evtl. speziell mit MFC-Containern). Vielleicht bist du nicht der einzige.

Ansonsten: Was genau meinst du mit "Ich habe ein Projekt vom VS 2010 in das VS 2012 übernommen"? Einfach das alte Projekt im neuen Studio geöffnet? Dazu würde mir einfallen, was passiert, wenn du ein ganz frisches 2012-Projekt erzeugst und die Quellcode-Dateien neu einfügst?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.09.2014, 22:57 Uhr
ao

(Operator)


Noch was, ich bin mir grad nicht sicher, welche Auswirkungen das hat, aber ich wundere mich über diese Zeile:

DiDbPolyline& poly = platArr.GetAt(i);

und zwar darüber, das poly eine Referenz auf DiDbPolyline ist. Ich würde es spontan als direkte Instanz von DiDbPolyline deklarieren (also das Referenz-Zeichen weglassen), zumal das Objekt ja in errArr eingefügt werden soll.

Versuch das mal, nicht, dass du dir mit dem Referenzgetue die Arrays kaputtmachst. Exception 0xC0000005 heißt Access Violation, auf Deutsch "Griff ins Klo". Das heißt, irgendwo ist Speicher zerschossen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: