Pointerarithmetik, arrays und buffer - Brauche mal Hilfe



  • Hallo zusammen,

    darf ich folgendes aus Sicht von C/C++ machen?:

    BYTE* buffer = (BYTE*) malloc(512);
    ZeroMemory((void*)buffer, 512);
    
    // hier werden Daten aus einer Datei in den buffer geschrieben
    
    DWORD* id;
    bool test = false;
    
    int i;
    for (i = 0; i < (512 - 4); i++)
    {
    	id = (DWORD*)(buffer + i);
    	if (id[0] == 0x61746164) // Test auf String "data"
    	{
    		test = true;
    		break;
    	}
    }
    
    free(buffer);
    

    Mit Visual C++ 6.0 läuft das Ganze, aber bei embedded Visual C++ auf nem iPAQ bekomme ich für i=1 eine exception "Datatype Misalignment" und der Debugger bleibt bei

    if (id[0] == 0x61746164)
    

    stehen 😕

    Deshalb wollte ich mal Fragen, ob der Source grundsärtzlich in Ordnung geht?



  • ne.

    char *buffer=new char[512];	//so wirds in c++ gemacht.
    //am ende
    delete[] buffer.
    

    Außerdem versteh ich nicht warum du unbedingt nen pointer id brauchst, und das auch noch nach dword konvertiert.
    schreib einfach

    if (buffer[i]=='d' && buffer[i+1]=='a' ...
    

    nur mal provisorisch. besser kannst du das durch eine innere for-schleife lösen. oder halt durch eine funktion, die die char's ausliest und das wort data erkennt und bool zurückliefert.



  • mathi schrieb:

    Mit Visual C++ 6.0 läuft das Ganze, aber bei embedded Visual C++ auf nem iPAQ bekomme ich für i=1 eine exception "Datatype Misalignment" und der Debugger bleibt bei

    if (id[0] == 0x61746164)
    

    stehen 😕

    Es gibt Systeme auf denen ein DWORD immer alignt sein muss. Mit malloc bekommst du das richtige Alignment - mit dem +1 hebelst du es aus.

    mach halt einen memcmp oder byteweisen vergleich...



  • Shade Of Mine schrieb:

    Es gibt Systeme auf denen ein DWORD immer alignt sein muss.

    Danke, wieder was neues dazu gelernt.

    @randa: Werde den Vergleich dann auch Byte/Char-Weise programmieren.

    👍
    Gruss mathi



  • Um das Problem zu umgehen kannst du auch vor die Variablendifinition
    das Zauberwort UNALIGNED angeben.



  • @case: Das Zauberwort hat tatsächlich geholfen, Danke! 😃


Anmelden zum Antworten