Christian schrieb:
> Bin ratlos.
Eine Möglichkeit der Ratlosigkeit Herr zu werden ist es, sich Papier und
Bleistift zu nehmen und einfach mal aufzuzeichnen, was du eigentlichg
erzeugen willst.
Im Endeffekt soll sowas rauskommen
1 | m (matrix-Objek) ( y-Objekte) (x-Objekte)
|
2 | +---+ +---+ +---------+ +---+---+---+---+
|
3 | | o------>| o------------------>| o------------->| | | | |
|
4 | +---+ +---+ +---------+ +---+---+---+---+
|
5 | | o--------+
|
6 | +---------+ | +---+---+---+---+
|
7 | +-->| | | | |
|
8 | +---+---+---+---+
|
(Ob diese Komplett-Struktur jetzt sinnvoll ist oder nicht, lass ich mal
dahingestellt)
Ich hab jetzt nur 2 Y-Objekte eingezeichnet und jeweils 4 X-Objekte. Die
Zahlen spielen aber keine besondere Rolle, denn im Endeffekt sind das ja
die x bzw. y Werte, die du vorgegeben hast.
So. Jetzt, da du weißt, wie das Ziel aussehen soll, wie kannst du es
erreichen. Am Anfang hast du nichts ausser einer Variablen m
1 | m
|
2 | +---+
|
3 | | |
|
4 | +---+
|
In welcher Reihenfolge muss jetzt was allokiert werden, damit du dich
auf dein Ziel zubewegst?
Lass dich von dem Gedanken leiten, dass du immer erst mal eine
Speicherfläche brauchst, damit du darin einen Pointer abspeichern
kannst. Wenn du irgendwas mittels malloc neu erzeugst, brauchst du
bereits vorhandenen Speicher um dort die Adresse einzutragen. In der
Zeichnung bedeutet das: Du brauchst erst mal ein Rechteck, ehe du einen
Pfeil auf ein neues Rechteck zeichnen kannst. Denn der Pfeil kann nicht
im leeren Raum beginnen.
Sieht man sich das Ziel an, dann geht da zuerst mal ein Pointer auf ein
Matrix Objekt. Also wirst du das erst mal allokieren müssen, denn diese
matrix Objekt benötigst du, um darin den Pointer auf die y-Objekte
ablegen zu können. (Die y-Objekte benötigst du wiederrum um darin dann
die Pointer auf die x-Objekte abzulegen.)
Also
1 | m = malloc( sizeof( matrix ) );
|
Damit hast du diesen Zustand
1 | m (matrix-Objek)
|
2 | +---+ +---+
|
3 | | o------>| |
|
4 | +---+ +---+
|
Wie gehts weiter?
Schau auf die Zeichnung, was du erreichen willst. Vom matrix Objekt geht
ein Pfeil aus zu einem Array von y-Objekten. Also wirst du die als
nächstes allokieren. Der Pfeil soll beginnen im Matrix Objekt und zwar
im Struktur-Member y und du brauchst ein Array mit einer gewissen Anzahl
an y-Objekten
1 | m = malloc( sizeof( matrix ) );
|
2 | m->y = malloc( y * y_size );
|
Gut. Damit hast du bis jetzt das hier erzeugt
1 | m (matrix-Objek) ( y-Objekte)
|
2 | +---+ +---+ +---------+
|
3 | | o------>| o------------------>| |
|
4 | +---+ +---+ +---------+
|
5 | | |
|
6 | +---------+
|
Wieder: Blick auf die Zeichnung, wie es weiter geht.
Von jedem einzelnen der y-Objekte soll ein weitere Pfeil ausgehen zu
einem x-Objekt, wobei ein x-Objekt wiederrum ein Array von Elementen
ist.
Also
1 | m = malloc( sizeof( matrix ) );
|
2 | m->y = malloc( anzahl_y * sizeof( y ) );
|
3 |
|
4 | for( i = 0; i < anzahl_y; ++i )
|
5 | m->y->x[i] = malloc( anzahl_x * sizeof( x ) );
|
Wenn du das mal in die Zeichnung nachträgst und aus jedem der einzelnen
y-Objekte einen Pfeil zu den jeweils neu allokierten Arrays
einzeichnest, dann landest du bei
1 | m (matrix-Objek) ( y-Objekte) (x-Objekte)
|
2 | +---+ +---+ +---------+ +---+---+---+---+
|
3 | | o------>| o------------------>| o------------->| | | | |
|
4 | +---+ +---+ +---------+ +---+---+---+---+
|
5 | | o--------+
|
6 | +---------+ | +---+---+---+---+
|
7 | +-->| | | | |
|
8 | +---+---+---+---+
|
Hoppla! Das ist aber genau die Komplettstruktur, die du erzeugen
wolltest.
UNterschätze nie die Macht, die dir Papier und Bleistift geben um dir
Gedankengänge und Abläufe klar zu machen!