Probleme beim erzeugen eines Dynamischen Arrays



  • Hallo zusammen,

    in meinem Programm erzeuge ich zur Laufzeit ein Dynamisches Array.

    In der Klasse ist es als Private deklariert:

    POINT* m_PointUeLuefter;
    

    In einer Funktion der Klasse soll die Größe festgelegt werden.

    m_PointUeLuefter=new POINT[56];
    

    Beim Kompilieren kommt keine Fehlermeldung, aber beim Debbugen kommt folgende Meldung in einer Messagebox:
    "First-change exception in Touch_Ausleger.exe: 0x80000002: Datatype Misalignment."

    Beim bestätigen mit OK springt der Debugger in folgenden Assembler Code (nur ein Ausschnitt):

    03F9241C   ldr       r10, [sp]
    03F92420   mov       r8, #0
    03F92424   ldr       r3, [r7]
    03F92428   mov       r6, #0
    03F9242C   cmp       r3, #0
    03F92430   addeq     r3, r5, #0x37
    03F92434   biceq     r3, r3, #0xF
    03F92438   subeq     r7, r3, #8
    03F9243C   add       r3, r5, #0x37
    03F92440   bic       r11, r3, #0xF
    03F92444   mov       lr, r7
    03F92448   ldr       r3, [lr]
    03F9244C   b         03F92454
    03F92450   ldr       r3, [lr, +r3]!
    03F92454   cmp       r3, #0
    03F92458   bgt       03F92450
    03F9245C   mov       r1, lr
    03F92460   mov       r0, r5
    03F92464   mov       r4, lr
    03F92468   bl        03F92170
    03F9246C   ldr       r3, [r4]
    03F92470   mov       lr, r0
    03F92474   rsb       r2, r3, #0
    03F92478   cmp       r2, r9
    03F9247C   bge       03F92524
    

    der Fehler liegt wohl in Zeile

    03F92450   ldr       r3, [lr, +r3]!
    

    da hier der Debbuger stehen bleibt.

    Wie kann ich das Problem umgehen? Kann es sein das die Adresse 0x80000002 für die Registry reserviert ist?

    Gruß
    spacehelix



  • spacehelix schrieb:

    Wie kann ich das Problem umgehen? Kann es sein das die Adresse 0x80000002 für die Registry reserviert ist?

    Ich denke nicht ...

    Zeig mal ein bisschen mehr von deinem Code. Also die Stellen, in denen du mit dem Array hantierst. Denn auf den ersten Blick sieht das alles schlüssig aus, also liegt der Fehler woanders.



  • spacehelix schrieb:

    Beim Kompilieren kommt keine Fehlermeldung

    und die wäre vielleicht auch sinnvoll?!



  • Hi,

    die Header sieht folgendermassen aus.

    class CUEBERSICHTLUFT
    {
    // Memberfunctions
    public:
    	CUEBERSICHTLUFT( );
    	~CUEBERSICHTLUFT( );
    	void Init();
    	void DrawUebersicht();
    private:
    	void Init900_8();
    	POINT* m_PointUeLuefter;
    protected:
    };
    

    die Funktion sieht so aus:

    void CUEBERSICHTLUFT::Init900_8()
    {
    	m_Uebersicht.luefterBackgroundWidth=38;	
    	m_Uebersicht.luefterBackgroundHeight=48;
    	m_Uebersicht.luefterBarHeight=40;
    	m_Uebersicht.luefterBarWidth=5;
    	m_Uebersicht.luefterBarLeft=4;
    	m_Uebersicht.luefterBarTop=4;
    	m_hBitmapLuefter=LoadBitmap(g_hInstance,MAKEINTRESOURCE(IDB_UE_L));
    	m_hBitmapBS=LoadBitmap(g_hInstance,MAKEINTRESOURCE(IDB_UE_BS));
    
    	m_PointUeLuefter=new POINT[56]; //Datatyp fehler wenn dies so gemacht wird. Warum?? 
    	//left												top							
    	m_PointUeLuefter[0].x=300;						m_PointUeLuefter[0].y=10;
    	m_PointUeLuefter[1].x=343;						m_PointUeLuefter[1].y=m_PointUeLuefter[0].y;		
    	m_PointUeLuefter[2].x=386;						m_PointUeLuefter[2].y=m_PointUeLuefter[0].y;	
    	m_PointUeLuefter[3].x=429;						m_PointUeLuefter[3].y=m_PointUeLuefter[0].y;	
    	m_PointUeLuefter[4].x=472;						m_PointUeLuefter[4].y=m_PointUeLuefter[0].y;		
    	m_PointUeLuefter[5].x=515;						m_PointUeLuefter[5].y=m_PointUeLuefter[0].y;	
    	m_PointUeLuefter[6].x=558;						m_PointUeLuefter[6].y=m_PointUeLuefter[0].y;		
    	m_PointUeLuefter[7].x=601;						m_PointUeLuefter[7].y=m_PointUeLuefter[0].y;	
    	m_PointUeLuefter[8].x=m_PointUeLuefter[0].x;	m_PointUeLuefter[8].y=63;		
    	m_PointUeLuefter[9].x=m_PointUeLuefter[1].x;	m_PointUeLuefter[9].y=m_PointUeLuefter[8].y;		
    	m_PointUeLuefter[10].x=m_PointUeLuefter[2].x;	m_PointUeLuefter[10].y=m_PointUeLuefter[8].y;	
    	m_PointUeLuefter[11].x=m_PointUeLuefter[3].x;	m_PointUeLuefter[11].y=m_PointUeLuefter[8].y;		
    	m_PointUeLuefter[12].x=m_PointUeLuefter[4].x;	m_PointUeLuefter[12].y=m_PointUeLuefter[8].y;	
    	m_PointUeLuefter[13].x=m_PointUeLuefter[5].x;	m_PointUeLuefter[13].y=m_PointUeLuefter[8].y;		
    	m_PointUeLuefter[14].x=m_PointUeLuefter[6].x;	m_PointUeLuefter[14].y=m_PointUeLuefter[8].y;		
    	m_PointUeLuefter[15].x=m_PointUeLuefter[7].x;	m_PointUeLuefter[15].y=m_PointUeLuefter[8].y;			
    	m_PointUeLuefter[16].x=m_PointUeLuefter[0].x;	m_PointUeLuefter[16].y=116;	
    	m_PointUeLuefter[17].x=m_PointUeLuefter[1].x;	m_PointUeLuefter[17].y=m_PointUeLuefter[16].y;
    	m_PointUeLuefter[18].x=m_PointUeLuefter[2].x;	m_PointUeLuefter[18].y=m_PointUeLuefter[16].y;	
    	m_PointUeLuefter[19].x=m_PointUeLuefter[3].x;	m_PointUeLuefter[19].y=m_PointUeLuefter[16].y;	
    	m_PointUeLuefter[20].x=m_PointUeLuefter[4].x;	m_PointUeLuefter[20].y=m_PointUeLuefter[16].y;	
    	m_PointUeLuefter[21].x=m_PointUeLuefter[5].x;	m_PointUeLuefter[21].y=m_PointUeLuefter[16].y;	
    	m_PointUeLuefter[22].x=m_PointUeLuefter[6].x;	m_PointUeLuefter[22].y=m_PointUeLuefter[16].y;	
    	m_PointUeLuefter[23].x=m_PointUeLuefter[7].x;	m_PointUeLuefter[23].y=m_PointUeLuefter[16].y;
    	m_PointUeLuefter[24].x=m_PointUeLuefter[0].x;	m_PointUeLuefter[24].y=169;
    	m_PointUeLuefter[25].x=m_PointUeLuefter[1].x;	m_PointUeLuefter[25].y=m_PointUeLuefter[24].y;	
    	m_PointUeLuefter[26].x=m_PointUeLuefter[2].x;	m_PointUeLuefter[26].y=m_PointUeLuefter[24].y;
    	m_PointUeLuefter[27].x=m_PointUeLuefter[3].x;	m_PointUeLuefter[27].y=m_PointUeLuefter[24].y;	
    	m_PointUeLuefter[28].x=m_PointUeLuefter[4].x;	m_PointUeLuefter[28].y=m_PointUeLuefter[24].y;
    	m_PointUeLuefter[29].x=m_PointUeLuefter[5].x;	m_PointUeLuefter[29].y=m_PointUeLuefter[24].y;	
    	m_PointUeLuefter[30].x=m_PointUeLuefter[6].x;	m_PointUeLuefter[30].y=m_PointUeLuefter[24].y;	
    	m_PointUeLuefter[31].x=m_PointUeLuefter[7].x;	m_PointUeLuefter[31].y=m_PointUeLuefter[24].y;	
    	m_PointUeLuefter[32].x=m_PointUeLuefter[0].x;	m_PointUeLuefter[32].y=222;	
    	m_PointUeLuefter[33].x=m_PointUeLuefter[1].x;	m_PointUeLuefter[33].y=m_PointUeLuefter[32].y;
    	m_PointUeLuefter[34].x=m_PointUeLuefter[2].x;	m_PointUeLuefter[34].y=m_PointUeLuefter[32].y;
    	m_PointUeLuefter[35].x=m_PointUeLuefter[3].x;	m_PointUeLuefter[35].y=m_PointUeLuefter[32].y;	
    	m_PointUeLuefter[36].x=m_PointUeLuefter[4].x;	m_PointUeLuefter[36].y=m_PointUeLuefter[32].y;	
    	m_PointUeLuefter[37].x=m_PointUeLuefter[5].x;	m_PointUeLuefter[37].y=m_PointUeLuefter[32].y;
    	m_PointUeLuefter[38].x=m_PointUeLuefter[6].x;	m_PointUeLuefter[38].y=m_PointUeLuefter[32].y;	
    	m_PointUeLuefter[39].x=m_PointUeLuefter[7].x;	m_PointUeLuefter[39].y=m_PointUeLuefter[32].y;
    	m_PointUeLuefter[40].x=m_PointUeLuefter[0].x;	m_PointUeLuefter[40].y=275;
    	m_PointUeLuefter[41].x=m_PointUeLuefter[1].x;	m_PointUeLuefter[41].y=m_PointUeLuefter[40].y;
    	m_PointUeLuefter[42].x=m_PointUeLuefter[2].x;	m_PointUeLuefter[42].y=m_PointUeLuefter[40].y;
    	m_PointUeLuefter[43].x=m_PointUeLuefter[3].x;	m_PointUeLuefter[43].y=m_PointUeLuefter[40].y;	
    	m_PointUeLuefter[44].x=m_PointUeLuefter[4].x;	m_PointUeLuefter[44].y=m_PointUeLuefter[40].y;	
    	m_PointUeLuefter[45].x=m_PointUeLuefter[5].x;	m_PointUeLuefter[45].y=m_PointUeLuefter[40].y;
    	m_PointUeLuefter[46].x=m_PointUeLuefter[6].x;	m_PointUeLuefter[46].y=m_PointUeLuefter[40].y;
    	m_PointUeLuefter[47].x=m_PointUeLuefter[7].x;	m_PointUeLuefter[47].y=m_PointUeLuefter[40].y;
    	m_PointUeLuefter[48].x=m_PointUeLuefter[0].x;	m_PointUeLuefter[48].y=328;
    	m_PointUeLuefter[49].x=m_PointUeLuefter[1].x;	m_PointUeLuefter[49].y=m_PointUeLuefter[48].y;
    	m_PointUeLuefter[50].x=m_PointUeLuefter[2].x;	m_PointUeLuefter[50].y=m_PointUeLuefter[48].y;	
    	m_PointUeLuefter[51].x=m_PointUeLuefter[3].x;	m_PointUeLuefter[51].y=m_PointUeLuefter[48].y;	
    	m_PointUeLuefter[52].x=m_PointUeLuefter[4].x;	m_PointUeLuefter[52].y=m_PointUeLuefter[48].y;	
    	m_PointUeLuefter[53].x=m_PointUeLuefter[5].x;	m_PointUeLuefter[53].y=m_PointUeLuefter[48].y;	
    	m_PointUeLuefter[54].x=m_PointUeLuefter[6].x;	m_PointUeLuefter[54].y=m_PointUeLuefter[48].y;	
    	m_PointUeLuefter[55].x=m_PointUeLuefter[7].x;	m_PointUeLuefter[55].y=m_PointUeLuefter[48].y;	
    
    }
    

    Der Fehler passiert nur wenn ich das Array Dynamisch erzeuge und auch genau an der Position. Erzeuge ich das Arrya statisch (POINT m_PointUeLuefter[56]; ) dann funktionierts.

    Gruß spacehelix



  • Poste doch bitte mal die Kompilermeldung, denn eigentlich sieht es halbwegs in ordnung aus was das dynamische erzeugen angeht



  • Hi,

    was für eine Meldung meinst du?

    beim Kompilieren erscheint keine Fehlermeldung. Nur beim Ausführen.

    Ich programmiere dies für ein Windows CE Sytem. In der Entwicklungsumgebung (eVC++) ist ein Windows CE emulator auf dem läufts. Nur wenn ich es auf der Hardware Debuggen möchte kommt die im ersten Posting angegebene Fehlermeldung.

    An anderen Stellen im Programm erzeuge ich auch Dynamische Arrays, dort funktioniert es.

    Gruß
    spacehelix



  • Ui, wie war das noch gleich?
    Erst Google und dann Forum ... stimmts!?

    Gleich der erste Link:
    http://support.microsoft.com/?scid=kb%3Ben-us%3B909973&x=9&y=22

    Und dass du für CE programmierst hättest du uns auch gleich am Anfang mitteilen können 😉



  • Hi,

    danke für den Link hat geholfen jetzt funktioniert es.

    Das ich für Windows CE Programmiere schreibe ich nicht sofort, da ich feststellen musste, dass die meisten davon abgeschreckt werden und dann Fragen nicht beantworten, weil sie denken das die Windows CE Welt anders aussieht. Ist aber in nur ganz wenigen fällen so.

    Gruß
    spacehelix


Anmelden zum Antworten