Hallo allerseits,
ich versuche seit Stunden Daten von einem Array als Bitmap zu speichern.
Jetzt bin ich drauf gekommen, dass der Header nicht stimmt. Ich habe den
Header in 2 structs aufgeteilt. Dieses Padding hab ich schon
ausgeschaltet (muss man erst mal drauf kommen).
In dem struct sind verschiedene Formate nacheinander abgespeichert. Mein
Plan war (auch in vielen Beilpielen ist das so realisiert), dass dieses
Struct dann einfach byte für byte in die Datei geschrieben wird. Nun ist
es so: struct bmpheader.widthbmp = 640. Wenn ich bmpheader.widthbmp
ausgebe, so erhalte ich 640. Allerdings wenn ich den Speicherbereich von
bmpheader.widthbmp auslese kommt Murks raus und ich verstehe nicht
warum. Warum ist das so und wie kann ich das Problem lösen?
Michael Schikora schrieb:> Dreh den Spieß mal um:> Nehme ein x-beliebiges Malprogramm, erzeuge Dir 'ne Bitmap> wie Du sie wünscht, und schau's Dir binär an.
Ja hab ich gemacht: Es liegt an dem Struct.
Beispiel:
1
structtest{
2
worda;
3
dwordb;
4
dwordc;
5
};
6
7
structtestnewtest;
8
newtest.a=10;
9
newtest.b=20;
10
newtest.c=600;
11
12
printf("%i",newtest.c);
Als Ausgabe erhalte ich 600. Würde passen. Und nun:
DirkB schrieb:> Du musst erst newtest in einen char* casten und dann dein Offset darauf> addieren.> Dazu reicht es etwas anders zu klammern.
Wie macht man sowas?
Hmm, anscheinend kommt bei mir doch kein direkter Murks raus...
printf("%x") gibt bei größeren zahlen als 255 grundsätzlich erstmal
ffffff aus. Der Rest dahinter passt: ffffff80, und der nächste hex-Wert
ist 02, also 640. Das würde passen. Was ist hier verkehrt?
Arc Net schrieb:> Wenn C und VS im Betreff steht, warum dann nicht die von MS> bereitgestellten Strukturen und Funktionen benutzen?
Ich wills ja verstehen warums nicht funktioniert.
So, ich glaub mich trifft der Schlag: mit folgendem cast geht das
printf: (unsigned char*). Ich dachte damit wird nur eingestellt um wie
viele bytes der pointer bei ++ weiterspringt. Was macht der Compiler da
schon wieder im Hintergrund für Sachen???
Das Problem ist nun, dass ofstream nur mit zeiger vom typ (char*)
umgehen kann und nicht mit (unsigned char*). Was kann ich noch tun?
Rolf Magnus schrieb:> Nennt sich Integer Promotion.
Ah, da kennt sich wer aus. Das Stichwort hätt ich in 100 Jahren nicht
gefunden.
Und schon wieder ein Grund warum ich am liebsten bei Assembler bleiben
würde ;-)