| Autor |
Beitrag |
Postman
      
Beiträge: 41
Windows 7
Delphi 2010
|
Verfasst: Mo 04.06.07 19:11
Hi!
Hab das Problem, dass ich nicht genau weiß, wie ich mir ein 3-dimensionales, dynamisches Array in Delphi vorstellen soll.
Ich zeig einfach mal vereinfacht, wie weit ich bin und was ich noch wissen will:
Delphi-Quelltext 1: 2: 3:
| SetLength(db_archiv,5); SetLength(db_archiv[z],10); SetLength(db_archiv |
Bei einem 2D Array war es recht einfach, die Funktionsweise rauszubekommen. Beim 3D-Array weiß ich nun allerdings nicht ob zuerst die Ebenen (z-Achse) kommt, oder ob y und x Achse zuerst gezeichnet werden.
Wär super, wenn mir jemand kurz erklären könnte, wie der Compiler dort arbeitet und wie die entsprechende Deklaration aussieht.
Schonmal danke im voraus 
Zuletzt bearbeitet von Postman am Mo 04.06.07 20:06, insgesamt 1-mal bearbeitet
|
|
Robinator
      
Beiträge: 275
WinXP
BDS 2006
|
Verfasst: Mo 04.06.07 19:30
Welche Dimension welcher achse entspricht kannst du eigentlich selber bestimmen, solange du es nicht innherhabl deines Programmes vertauscht, spielt das nicht wirklich eine Rolle.
gruss, Rob
_________________ erare humanum est
|
|
Postman 
      
Beiträge: 41
Windows 7
Delphi 2010
|
Verfasst: Mo 04.06.07 19:34
Hm hab wohl den Wald vor lauter Bäumen nicht gesehen. Die 10 Beispiele die ich mir angeguckt habe, sind halt immer davon ausgegangen, dass man zuerst die Zeilenanzahl festlegt und von dort aus weitermacht. Werds mal andersrum probieren.
|
|
Postman 
      
Beiträge: 41
Windows 7
Delphi 2010
|
Verfasst: Mo 04.06.07 20:10
Hm ne komm einfach nicht weiter. Ich bekomm ständig irgendwelche Fehlermeldungen (wahrscheinlich weil ich versuche, irgendwo was hinzuspeichern, wo noch kein Speicher für reserviert worden ist).
Wie bekomm ich es hin, dass ich am Ende ein Array mit den Angaben (x,y,z) ansprechen kann?
x - Spalten
y - Zeilen
z - Ebenen
Mit den Angaben soll es möglich sein, ein Stringgrid bzw. später eine MySQL Tabelle zu füllen. Kann mir da mal jemand ein paar Beispiele geben? Hier im Forum und bei Google findet man dazu kaum brauchbare Beispiele...
|
|
Marco D.
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Mo 04.06.07 20:19
Schaust du bei Christian vorbei.
Delphi-Quelltext 1: 2: 3: 4:
| SetLength(my2DIntArray, 3); SetLength(my2DIntArray[0], 1); SetLength(my2DIntArray[1], 5); SetLength(my2DIntArray[2], 7); |
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Mo 04.06.07 20:31
Warum so kompliziert?
Delphi-Quelltext 1:
| SetLength(FArray,11,12,13); |
heißt 11 in x, 12 in y und 13 in z!
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
Robinator
      
Beiträge: 275
WinXP
BDS 2006
|
Verfasst: Mo 04.06.07 20:33
Hi, Delphi-Quelltext 1:
| T3DArray = Array of Array of Array of Bla; | das is nun erstmal nen einfaches 3D Array. Du kannst nun auf unterschiedliche art und weise beeinflussen, wie viele einträge dieses haben soll Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| 3DArray : T3DArray; X, Y, Z : integer;
SetLength(3DArray, X, Y, Z); SetLength(3DArray, X); SetLength(3DArray[X - 1], Y); SetLength(3DArray[X - 1, Y - 1], Z); | Ich hoffe das bringt etwas klarheit ;) gruss, Rob //edit Ups, der Name der Variablen darf natürlich nicht mit einer Zahl anfangen 
_________________ erare humanum est
|
|
Postman 
      
Beiträge: 41
Windows 7
Delphi 2010
|
Verfasst: Mo 04.06.07 20:51
Leider bringt mich das garnicht weiter. Die Spaltenanzahl in der Tabelle soll gleich bleiben, während Zeilen (einzelne Einträge) und Ebenen-Anzahl (einzelne User) sich variable verändern können sollten.
Dabei ist es leider nicht völlig egal wo die Schleifen kommen, da mittendrin noch eine MySQL Abfrage sitzt:
Am liebsten wäre mir irgendwas nach folgendem Prinzip:
Useranzahl abfragen, Ebenenanzahl auf die festgestellte Zahl setzen. (Z)
10 Spalten festlegen (X)
MySQL Abfrage, je nach Archivgröße nun Y-Einträge vornehmen.
Bisher sah das bei mir so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| useranzahl := FResult.RowsCount; SetLength(db_archiv,useranzahl,9); for z := 0 to useranzahl-1 do begin FResult := FMysql.query('SELECT * FROM ma_archiv_'+inttostr(z)+';',true,ex); if FResult<>nil then begin for x := 0 to 9 do SetLength(db_archiv[x,z],100); end; end; |
|
|
Stefan.Buchholtz
      
Beiträge: 612
WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
|
Verfasst: Di 05.06.07 08:38
Ich sehe zwei Fehler: Einmal hast du in der inneren Schleife die beiden Array-Indezes vertauscht. Ausserdem lässt du x von 0..9 laufen, hast aber vorher im SetLength auch 9 angegeben. Da die arrays nullbasiert sind, ist der höchste erlaubte Index 8:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| useranzahl := FResult.RowsCount; SetLength(db_archiv, useranzahl, 9); for z := 0 to useranzahl-1 do begin FResult := FMysql.query('SELECT * FROM ma_archiv_'+inttostr(z)+';',true,ex); if FResult<>nil then begin for x := 0 to 8 do begin SetLength(db_archiv[z, x], 100); end; end; end; |
Stefan
_________________ Ein Computer ohne Windows ist wie eine Schokoladentorte ohne Senf.
|
|
Postman 
      
Beiträge: 41
Windows 7
Delphi 2010
|
Verfasst: Do 14.06.07 16:35
Sorry, fürs nicht antworten, war ne Woche im Urlaub
Danke für die Denkansätze, hab das Ganze jetzt in einer eigenen Klasse untergebracht, dadurch ist das Problem mit den mehreren Dimensionen gar nicht erst aufgetreten 
|
|
|