Forum: PC-Programmierung Groesse eines 3D Arrays zur Laufzeit festlegen


von Christian J. (Gast)


Lesenswert?

Hallo,

ich müsste während der Laufzeit, abhängig von einer User Eingabe ein 2D 
Array anlegen. x_size und y_size sind vorher unbekannt. Um effizient zu 
bleiben möchte ich keine Maximalgroesse festlegen und dann quasi 
Max-Indizes verwenden.

Meine Idee wäre das in einem Struct auf dem Heap zu erledigen aber wie 
geht das genau?

Wäre ein Zugriff dann so möglich

hptr = struct->myarray[x][y]

Oder gibt es da elegantere Lösungen?


Gruss,
Christian

von Peter II (Gast)


Lesenswert?

Christian J. schrieb:
> hptr = struct->myarray[x][y]

einfach selber rechnen

hptr = struct->myarray[x*SIZE_Y + y]

von Christian J. (Gast)


Lesenswert?

Aber wie wird das deklariert? Ein Array braucht ja nunmal eine 
zugewiesene Groeße.....

1. read x,y von user
2. allokiere array mit y*y elementen
3. pointer auf heap erzeugen
4. zugriff auf array

wie sehen 2,3 und 4 aus?

von Tom (Gast)


Lesenswert?

braucht es das?
Also eine zugewiesene Größe?! Wäre mir neu.

von Christian J. (Gast)


Lesenswert?

Sorry, ich kann mit Einzeilerantworten und Gegenfragen nicht viel 
anfangen. Danke, ich suche es mir selbst im Netz zusammen.....

von Georg (Gast)


Lesenswert?

Christian J. schrieb:
> Aber wie wird das deklariert? Ein Array braucht ja nunmal eine
> zugewiesene Groeße.....

Aber in C darfst du doch sowieso alles - auch auf ein als 2 x 2 
deklariertes array mit den Indexen x und y beliebiger Grösse zugreifen. 
Dazu brauchst du nur den Pointer auf das erste (bzw. nullte) Element. 
Das geht auch in anderen Sprachen, solange du nicht den Compiler 
explizit anweist, die Arraygrenzen beim Zugriff zu überwachen.

Georg

von Karl H. (kbuchegg)


Lesenswert?

Christian J. schrieb:
> Aber wie wird das deklariert? Ein Array braucht ja nunmal eine
> zugewiesene Groeße.....

Da du aber kein Array hast, sondern nur einen Pointer ....

Selber indizieren ist schon ok.
1
   int size_x, size_y;
2
3
   size_x und size_y einlesen 
4
5
   int * pData = malloc( size_x * size_y * sizeof(int) );
6
7
   x = 5;
8
   y = 8;
9
10
   pData[ y * size_x + x ] = 45;
11
12
   free( pData );

Am besten die ganze Sache in ein paar Funktionen kapseln.
* Array allokieren
* Wert von einer Position lesen
* Wert an eine Position schreiben
* Array freigeben

von Christian J. (Gast)


Lesenswert?

Karl Heinz schrieb:
> Am besten die ganze Sache in ein paar Funktionen kapseln.
> * Array allokieren
> * Wert von einer Position lesen
> * Wert an eine Position schreiben
> * Array freigeben

Cool, danke !!!! Was wäre dieses Forum ohne Karl-heinz? :-)

von Karl H. (kbuchegg)


Lesenswert?

Christian J. schrieb:
> Karl Heinz schrieb:
>> Am besten die ganze Sache in ein paar Funktionen kapseln.
>> * Array allokieren
>> * Wert von einer Position lesen
>> * Wert an eine Position schreiben
>> * Array freigeben
>
> Cool, danke !!!! Was wäre dieses Forum ohne Karl-heinz? :-)


Was wären die Frager, wenn sie sich jeder einfach mal ein C-Buch kaufen 
würden?

: Bearbeitet durch User
von Christian J. (Gast)


Lesenswert?

Karl Heinz schrieb:

> Was wären die Frager, wenn sie sich jeder einfach mal ein C-Buch kaufen
> würden?

Tja, vielleicht ein leeres Forum? Ich bräuchte meine Kollegen eigentlich 
auch nichts mehr fragen, es steht sicher irgendwo auch im Internet....

http://de.wikibooks.org/wiki/C-Programmierung:_Arrays

von Karl H. (kbuchegg)


Lesenswert?

Christian J. schrieb:
> Karl Heinz schrieb:
>
>> Was wären die Frager, wenn sie sich jeder einfach mal ein C-Buch kaufen
>> würden?
>
> Tja, vielleicht ein leeres Forum?

unwahrscheinlich.
Da bleibt noch genug übrig. Die Beherrschung der Programmiersprache ist 
gerade mal das Wissen, wie man Schachfiguren bewegt. Den Rest seines 
Lebens lernt man, wie man mit Zugfolgen ein Schachspiel gewinnen kann. 
Was beim Schach die Zugfolgen sind, sind in der Programmierung 
Algorithmen.

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.