boost::shared_ptr mit Objekt variabler Größe
-
Hi zusammen,
ich habe folgendes Problem: Ich möchte eine Struktur dynamischer Größe in einen
shared_ptrverpacken, weiß aber nicht so wirklich, wie ich das angehen soll. Die Struktur hat deshalb eine dynamische Größe, weil sie aus einem Bitmapheader, einer Palette und dann den Bitmapdaten selbst besteht. Die Größe der Bitmapdaten hängen natürlich von der Größe und Farbtiefe ab, im Groben sieht die Struktur so aus:// Struktur ist byte aligned #pragma push -a1 struct Bitmap { BITMAPINFOHEADER BitmapInfo; RGBQUAD Palette[256]; unsigned char BitmapData[]; void foo(); void bar(); }; #pragma popBisher sah die Erzeugerfunktion so aus:
Bitmap* create_bitmap( unsigned int w, unsigned int h, unsigned char bpp ) { unsigned int Size = sizeof( BITMAPINFOHEADER ) + 256 * sizeof( RGBQUAD ) + (w * h * bpp); Bitmap* bmp = (Bitmap*) malloc( Size ); // bmp initialisieren return bmp; }Das möchte ich jetzt vernünftig in einen
smart_ptrverpacken, darf aber die Bitmap Struktur nicht anfassen sondern nur die Erzeugerfunktion. Das Problem ist, dass die Bitmap Struktur bei der Erzeugung eigentlich keine Struktur, sondern nur ein Byte Array ist. Bin mir sogar nicht einmal sicher, ob das valides C/C++ ist.
-
So würde es gehen:
boost::shared_ptr<Bitmap> create_bitmap( unsigned int w, unsigned int h, unsigned char bpp ) { unsigned int Size = sizeof( BITMAPINFOHEADER ) + 256 * sizeof( RGBQUAD ) + (w * h * bpp); return boost::shared_ptr<Bitmap>(static_cast<Bitmap*>(std::malloc(Size)), &std::free); }allerdings ist das
unsigned char BitmapData[];kein gültiges C++.
-
DocShoe schrieb:
Bin mir sogar nicht einmal sicher, ob das valides C/C++ ist.
Ist es nicht. Um da verlässlichen, portablen, sicheren, (...) Code zu haben, solltest du die API, die dir das nicht zu ändernde Bitmap struct aufzwingt, wegkapseln und außerhalb mit einer ordentlichen C++-Struktur arbeiten.
-
Danke, geht.
Werde mal sehen, dass man dasunsigned char BitmapData[]durchunsigned char BitmapData[1]ersetzt, damit wird´s gültig.
-
DocShoe schrieb:
Danke, geht.
Werde mal sehen, dass man dasunsigned char BitmapData[]durchunsigned char BitmapData[1]ersetzt, damit wird´s gültig.*ieks* Gültig vielleicht. Aber nicht wirklich besonders schön...
-
DocShoe schrieb:
Danke, geht.
Werde mal sehen, dass man dasunsigned char BitmapData[]durchunsigned char BitmapData[1]ersetzt, damit wird´s gültig.Wenn Du es so weit ändern kannst, dann kannste auch gleich
char *davon machen.
-
Tachyon schrieb:
DocShoe schrieb:
Danke, geht.
Werde mal sehen, dass man dasunsigned char BitmapData[]durchunsigned char BitmapData[1]ersetzt, damit wird´s gültig.Wenn Du es so weit ändern kannst, dann kannste auch gleich
char *davon machen.Ich nix versteh.
Da hängt ein Array hinten dran, direkt die Daten, kein Zeiger.