Header/Structs/Arrays

Ich definiere ja zunächst eine Struktur mit 3 Variablen und einem Pointer (warum hat der eigentlich einen unterstrich? Ist das Usus?)
Der Unterstrich ist in C++ Usus für private Attribute einer Klasse. Das sollte nur andeuten, dass man auf dieses Strukturmitglied nicht direkt zugreifen sollte, sondern nur über die bereitgestellten Funktionen.
C:
  struct my_mesh {
  double x, y, z;
  double* _mem;
};

Anschließend erzeuge ich solch eine struktur und initialisier diese direkt. Die Werte 1,2,3 werden den Variablen x,y,z der Struktur zugewiesen und der Pointer allokiert Speicher. Warum?
Für den Zeiger (bzw. das Array) wird Speicher allokiert weil Speicher dafür benötigt wird.
C:
struct my_mesh mesh = { 1, 2, 3, calloc(3*3*3, sizeof(double)) };
Es schadet zwar nichts zuviel Speicher zu allokieren, aber du benötigst nur 1*2*3 double Arrayelemente.
Was hier gemacht wird, versteh ich irgendwie gar nicht. Anscheinend wird hier der 3D Array erzeugt. Aber wie genau sieht da die Verbindung zur Struktur aus? Kann ich mir das so vorstellen, dass ich keinen double-Array erzeuge, sondern einen my_mesh-Array?
Was genau macht die untere Zeile und was bewirkt "typedef" ?
C:
Wäre wirklich klasse, wenn du mir das noch erklären könntest.
Danke!
typedef double (*array_3d)[j][k];
array_3d mesh_x = (array_3d)mesh._mem;
Typedef macht eigentlich gar nichts (effektiv). Man definiert damit nur einen Alias für einen anderen Typ. In dem Fall ist "array_3d" ein Typ, welcher für "Zeiger auf ein double Array der Dimension (j,k)" steht.

Der "Trick" ist lediglich, das du in der Struktur einen Speicherblock hast und mittels des Casts vom Typ "double*" zum Typ "array_3d" erreichst, das du diesen Speicherblock wie ein 3D Array verwenden kannst.

Letztendlich ist das alles nur "syntaktischer Zucker". Das gleiche hätte man auch so erreichen können:
C:
mesh_x[1][2][3]

// alternativ:

mesh._mem[1 * mesh.y * mesh.z + 2 * mesh.z + 3]
Gruß
 
Ich habe leider aktuell nicht viel Zeit, um den Code zu überprüfen. Aber deine Erklärung hat mir wiedermal gut geholfen. Also Vielen Dank für deine Hilfe und die ausführlichen Antworten!
 
Zurück