Probleme mit structures´, union und buffern
-
ich hab folgenden code:
typedef union { unsigned char data[3]; struct {unsigned char R,G,B;}; }COLOR_RGB; /*ich hab das deklariert, um daraus einen buffer zu machen:*/ COLOR_RGB *pixbuf; /*und dann im hauptprogramm:*/ pixbuf = new COLOR_RGB[xres*yres];
meine Frage jetzte: gibt es da irgendwie einen eleganteren Weg?
ich habe z.B. bereits das normale struct statt typedef union und der structre innerhalb der union benutzt, aber dann bekomme ich teilweise Speicherfehler im buffer, d.h. der Computer scheint die bits im buffer irgendwie nich so streng aneinanderzureiehn, wie bei der Lösung mit union, ausserdem bekomme ich ständig vom compiler die Warnung das die Zeile "struct[unsigned char R,G,B;};" nicht dem standart entspricht.
Außerdem läßt sich die union teilweise in meinem Programm in diversen Klassen nicht initialisieren, z.B. in den Klassendeklarationen hab ich damit extxreme sschwierigkeiten. Ich wollte mal wissen, was ihr da so für alternativen benutzt,und ob es möglich ist, solch einen buffer nicht aus structure arrays, oder union arrays, sondern mithilfe von klassen zusammenzusetzen? (wichtig ist: im buffer darf keine speicherlücke vorhenden sein (also z.B. in meinem Fall: RGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBusw....) (z.B. vector structres o.ä.) ()
-
wenn du nen rgba hättest, würde ich dir nen dword vorschlagen,aber um standard konform zu bleiben sollteste vielleicht sowas machen:
struct farben{ unsigned char R,G,B }; union color_rgb{ farben Colors; unsigned char Colorarray[3]; };
-
yeus schrieb:
wichtig ist: im buffer darf keine speicherlücke vorhenden sein (also z.B. in meinem Fall: RGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBRGBusw....)
Da hast du leider Pech. Das wird nicht funktionieren, da Strukturen vom Compiler immer entsprechend ausgerichtet werden. Diese Einstellung kann man meistens anpassen, allerdings wirds dann schnell problematisch mit der Portabilität und ich bin mir auch nicht sicher ob jeder Compiler die Ausrichtung auf 3 Bytes beherrscht. Das beste was du da wohl machen kannst, ist dir eine eigene rgb_array Klasse zu basteln (die kann dann zB std::vector benutzen) und dort dafür sorgst, dass alle Farben zusammenhängend im Speicher liegen.
yeus schrieb:
ausserdem bekomme ich ständig vom compiler die Warnung das die Zeile "struct[unsigned char R,G,B;};" nicht dem stan**** entsprich
Das liegt daran, dass ISO C++ keine unnamed Strukturen erlaubt. Siehe
struct {unsigned char R,G,B;};
yeus schrieb:
meine Frage jetzte: gibt es da irgendwie einen eleganteren Weg?
Selbiges Problem hatte ich bei einer Vektorklasse, die ich mal geschrieben hatte. Hab gedacht, dass das Problem am besten mit union zu lösen wäre. Davon hab ich mich mittlerweile distanziert. Erstens gab es diverse Probleme bezüglich ctor Initialisierung und zweitens hab ich keine Aussagen darüber, dass der Standard mir garantiert, dass zB vec.y auf dieselbe Speicherstelle zugreift wie vec[1].
Mittlerweile benutze ich folgende Lösung mit überladenem [] operator. Sie ist mindestens genauso sauber bzw. unsauber wie die union Variante, mir reicht sie momentan aber vollkommen aus.class my_vector { public: fp32 x; fp32 y; fp32 z; const fp32& operator [](size_t index) const { // hier sollte man noch prüfen ob index einen korrekten Wertebereich hat // ... return (&x)[index]; } fp32& operator [](size_t index) { // hier sollte man noch prüfen ob index einen korrekten Wertebereich hat // ... return (&x)[index]; } };
Das sollte auch problemlos auf deine RGB Struktur anwendbar sein.
-
thx
das war genau das, wonach ich gesucht hab