Forum: PC-Programmierung Arrays mit variabler Größe in C++ über ein scruct?


von xvzf (Gast)


Lesenswert?

Hallo,
ich habe folgendes Problem:
Um ein einfaches Bild zu speichern habe ich folgendes struct angelegt:
1
struct image {
2
    uchar*  data; 
3
    int height;  
4
    int width;   
5
};

image.data ist ein drei dimensionales array, das mit image.data = new 
uchar[10][10][3] angelegt wird (nur als bsp.).

Auf diese Elemente möchte ich jetzt in meiner Funktion zugreifen.
Gedacht war das so:
1
R = test.data[i][j][0];
2
G = test.data[i][j][1];
3
B = test.data[i][j][2];

Allerdings kommt beim kompilieren die Fehlermeldung
"invalid types 'unsigned char[int]' for array subscript".

Nun die Frage, wie kann ich das ganze lösen? Das array wird immer eine 
andere Größe haben, deshalb kann ich das nicht im struct definieren.
Gibt es eine Möglichkeit einfach die Position in Bytes zu berechnen, an 
der das ganze liegt, und diese dann ausliest?

Danke für eure Hilfe!

von Peter II (Gast)


Lesenswert?

xvzf schrieb:
> Nun die Frage, wie kann ich das ganze lösen?

du musst selber den index ausrechnen.

R = test.data[i * 10 *3 + j * 10 + 0 ];
R = test.data[i * 10 *3 + j * 10 + 1 ];
R = test.data[i * 10 *3 + j * 10 + 2 ];

von Reinhard Kern (Gast)


Lesenswert?

Peter II schrieb:
> du musst selber den index ausrechnen.

Und den benötigten Speicherplatz reservieren. Damit liegt alle 
Verantwortung für Buffer Overflows und Memory Leaks bei dir, aber das 
heisst ja nicht dass es nicht geht.

Gruss Reinhard

von Sven P. (Gast)


Lesenswert?

xvzf schrieb:
> image.data ist ein drei dimensionales array, das mit image.data = new
> uchar[10][10][3] angelegt wird (nur als bsp.).

Ich denke, du könntest das dann auch wieder auf diesen Typ casten, damit 
der Compiler die Subskripte selbst umrechnet.

In C++ gibts aber sicherlich noch mindestens 100 andere tolle Klassen 
für sowas..

von Peter II (Gast)


Lesenswert?

Sven P. schrieb:
> Ich denke, du könntest das dann auch wieder auf diesen Typ casten, damit
> der Compiler die Subskripte selbst umrechnet.

der type ist ja nicht konstant, sonst könnte er ihn ja hinschreiben. Im 
Type müsste die Dimensionen vorhanden sein, aber diese sind ja nicht 
fest.

> In C++ gibts aber sicherlich noch mindestens 100 andere tolle Klassen
> für sowas..
ja Container gibt es.

von xvzf (Gast)


Lesenswert?

Habs jetzt mit std::vector realisiert :)
Danke!

von Vlad T. (vlad_tepesch)


Lesenswert?

xvzf schrieb:
> Habs jetzt mit std::vector realisiert :)
> Danke!

au weia.
das macht man mit Bilddaten nicht. die lässt man komplett im Speicher 
liegen und zerhackstückelt sie nicht in 1001 Vectoren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.