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 einfachif (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!