Hier ist ein Ansatz unter Verwendung von C und structs, um etwas in Richtung objektorientierter Programmierung zu bieten, zusammen mit einer Reihe von Hilfsfunktionen.
Die Idee hier war es, Kerricks Vorschlag eines zusammenhängenden Arrays zu verwenden.
Ich bin mir nicht sicher, ob ich die Offset-Berechnung korrekt habe und es wurde nicht getestet, daher ist es das wert, was du bezahlst. Es könnte jedoch als Ausgangspunkt hilfreich sein.
Die Idee ist, einen einzigen zusammenhängenden Speicherbereich zu haben, um die Speicherverwaltung einfacher zu gestalten. Und eine Funktion zu verwenden, um auf ein bestimmtes Element mit einem nullbasierten Offset in x-, y- und z-Richtung zuzugreifen. Da ich mir nicht sicher war, welcher Elementgröße/-typ, habe ich auch dies zu einer Variable gemacht.
#include
typedef struct _Array3d {
int elSize; // Größe jedes Elements des Arrays in Bytes
int side; // Länge jeder Seite des 3D-Würfels in Elementen
char * (*Access) (struct _Array3d *pObj, int x, int y, int z);
char buffer[1];
} Array3d;
static char * Array3d_Access (Array3d *pObj, int x, int y, int z)
{
char *pBuf = NULL;
if (pObj && x < pObj->side && y < pObj->side && z < pObj->side) {
pBuf = &(pObj->buffer[x * pObj->side * pObj->elSize * pObj->side * pObj->elSize + y * pObj->side * pObj->elSize + z * pObj->elSize]);
}
return pBuf;
}
// Erstellt einen Array3d-Würfel, indem die Länge jeder Seite zusammen mit der Größe jedes Elements angegeben wird.
Array3d *Array3d_Factory (int side, int elSize)
{
Array3d *pBuffer = malloc (sizeof(Array3d) + side * elSize * side * elSize * side * elSize);
if (pBuffer) {
pBuffer->elSize = elSize;
pBuffer->side = side;
pBuffer->Access = Array3d_Access;
}
return pBuffer;
}
// Erstellt einen Array3d-Würfel, der die gleiche Größe wie ein vorhandener Array3d-Würfel hat.
Array3d *Array3d_FactoryObj (Array3d *pObj)
{
Array3d *pBuffer = NULL;
if (pObj) {
int iBufferSize = pObj->side * pObj->elSize * pObj->side * pObj->elSize * pObj->side * pObj->elSize;
pBuffer = malloc (sizeof(Array3d) + iBufferSize);
if (pBuffer) {
pBuffer->elSize = pObj->elSize;
pBuffer->side = pObj->side;
pBuffer->Access = pObj->Access;
}
}
return pBuffer;
}
// Dupliziert oder klonen Sie einen vorhandenen Array3d-Würfel in einen neuen.
// Gibt NULL zurück, wenn das Klone nicht erfolgt ist.
Array3d *Array3d_Dup (Array3d *pObjDest, Array3d *pObjSrc)
{
if (pObjSrc && pObjDest && pObjSrc->elSize == pObjDest->elSize && pObjSrc->side == pObjDest->side) {
int iBufferSize = pObjSrc->side * pObjSrc->elSize * pObjSrc->side * pObjSrc->elSize * pObjSrc->side * pObjSrc->elSize;
memcpy (pObjDest->buffer, pObjSrc->buffer, iBufferSize);
} else {
pObjDest = NULL;
}
return pObjDest;
}
int main(int argc, _TCHAR* argv[])
{
Array3d *pObj = Array3d_Factory(10, 20 * sizeof(char));
char *pChar = pObj->Access(pObj, 1, 2, 3);
return 0;
}