Strukturenoptimierung durch MS VS C++
-
Alóha,
es geht um die Strukturenoptimierung unter MS VS C++. Ja, ich habe bewusst
MS VS C++ gesagt, weil anscheinend nur er die Strukturen optimiert. Und
damit wär's auch schon gesagt, die Strukturen sollen NICHT optimiert
werden. Habe alles mögliche von:#pragma OPTIMIZE OFFbishin zu:
#pragma pack(push,1)versucht, doch nichts scheint zu klappen. Interessant dabei zu
beobachten, parallel zu meinem Bitmapdecoder schreibe ich einen
MD2-Modelloader der ebenfalls Strukturen einliesst. Das komische
daran, bei beiden Projekten gibt es irgendwann die Fehlermeldung, wenn
ich etwas aus den Daten auslesen möchte, dass wohl eine Access
Vialation stattgefunden hat. Und bei beiden Projekten werden bei
beiden Strukturinstanzen immer der Wert von '0xccccccc' angezeigt,
welcher völlig unrealistisch für eine einfache Einlesung ist. Ich
weiss nicht ob es nur bei mir so ist oder ob es überhaupt an MS VS C++
liegt, meine Vermutung beruht aber darauf.Erste Access Vialation (Bitmapdecoder):
bitmap_Image=new unsigned char[o_Bitmap.InfoHeader.biSizeImage];bitmap_Image ist ein Zeiger vom Datentyp 'unsigned char', o_Bitmap ist
ein Objekt von der Klasse, InfoHeader (BITMAPINFOHEADER) ein Objekt
der Struktur, die ausgelesen wird und 'biSizeImage' ist die Größe der
Bilddaten in Byte.Die AV, Fehlermeldung dazu:
Unbehandelte Ausnahme bei 0x7c81eb33 in Lesson1.exe: Microsoft C++-Ausnahme: std::bad_alloc an Speicherposition 0x0012f974.. + bitmap_Image 0xcccccccc <Schlechtes Ptr> unsigned char * biSizeImage 3435973836 unsigned long etc.Das einzige was mir bis jetzt in den Sinn kam war, dass die Struktur
falsch eingelesen war (nicht der Fall), biSizeImage falsch definiert
wurde (auch nicht der Fall) oder auf Speicher zugegriffen wird der
nicht da ist (Oh net der Fall) und die Speicheradresseirung wird wohl
auch nicht so hoch sein.Deswegen muss es meines Erachtens nach an der Optimierung liegen, die MS
VS C++ automatisch durchführt und zwar bei Strukturen. Kann mir irgendein MS VS C++ Experte vielleicht Rat geben, macht langsam echt
keinen Spaß mehr, weil es dauernd Ärger damit gibt.Vielen lieben Dank im Voraus!
-
std::bad_alloclässt darauf schliessen, dass du zu viel Speicher angefordert hast, und kein neuer mehr allokiert werden konnte. Hast du denn im Debugger geschaut, wie viel Speicher du anforderst und was der Exception-String aussagt? Und die übergebenen Daten in den eckigen Klammern sind korrekt?Du kannst in den Projekt-Eigenschaften folgenden Eintrag ändern: C++ -> Codegenerierung -> Ausrichten der Strukturmember.
Ich bin mir aber nicht sicher, ob das tatsächlich Auswirkungen hat, und weiss auch nicht, ob das Alignment zu den Compiler-Optimierungen zählt. Falls ja, sollte das im Debug-Modus sowieso deaktiviert sein.
-
Das ist alles sehr wirr, und deine Schlussfolgerungen erfolgen eher ins Blaue hinein. Jedenfalls solltest du dir evtl. mal den konkreten Wert von o_Bitmap.InfoHeader.biSizeImage anschauen, schließlich ist 3435973836 auch nicht gerade klein...
-
camper schrieb:
schließlich ist 3435973836 auch nicht gerade klein...
3435973836 == 0xcccccccc == uninitialisiert (msvc++ debugging rtl).
-
Dann sollte das im Debug-Modus das Programm auch mit der entsprechenden Meldung unterbrechen ("The variable .. is being used without being intialized").
-
Erstmal vielen lieben Dank das so schnelle Antworten kamen.
Wenn ich auf 'Ausrichten des Strukturmmember' klicke hab ich mehrere Optionen, ob ich zwischen 2, 4, 6, 8,...16 Byte etc. haben möchte. Was tun?
-
way schrieb:
Erstmal vielen lieben Dank das so schnelle Antworten kamen.
Wenn ich auf 'Ausrichten des Strukturmmember' klicke hab ich mehrere Optionen, ob ich zwischen 2, 4, 6, 8,...16 Byte etc. haben möchte. Was tun?
Gar nichts. Das ist nicht das Problem.
-
Der Dank geht nach vielen Tagen an RedEagle, nachdem wir ziemlich lange rumexperimentiert haben, haben wir, bzw. Er etwas herausgefunden, was gleichzeitig das Problem behoben hat. Und zwar musste mit fseek zu etwas gesprungen werden, bevor es eingelesen. Naja, die Art wie und was mir MS VS C++ da ausgeben hat war ja nicht viel informativer wie die Fehlermeldungen "Programm_xyz.exe musste aus einem ungeklrten Grund geschlossen werden-Problembericht senen".
Trotzdem Danke ich Allen vielmals.
-
way schrieb:
Der Dank geht nach vielen Tagen an RedEagle, nachdem wir ziemlich lange rumexperimentiert haben, haben wir, bzw. Er etwas herausgefunden, was gleichzeitig das Problem behoben hat. Und zwar musste mit fseek zu etwas gesprungen werden, bevor es eingelesen. Naja, die Art wie und was mir MS VS C++ da ausgeben hat war ja nicht viel informativer wie die Fehlermeldungen "Programm_xyz.exe musste aus einem ungeklrten Grund geschlossen werden-Problembericht senen".
Trotzdem Danke ich Allen vielmals.Ein Hoch auf Mr. Allen RedEagle, Herausfinder des Monats. Während die C++-Nazis hier im Forum noch ihren std::schlagmichtot-Wahn ausleben, löst Allen die wahren Probleme im Alleingang, schnell und effizient. So wie Profis das nun mal tun.
Auf den Tipp mit fseek hättest du hier ewig und drei Tage warten müssen!Danke, Allen!
-
Un trollo magnifico schrieb:
Auf den Tipp mit fseek hättest du hier ewig und drei Tage warten müssen!
seine fehlerbeschreibung war mies. das hätte sowieso niemand rausbekommen. sei doch nicht so unfair zu unserer std-doppel-doppelpünktchen-fraktion.
