Autor Beitrag
Postman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41

Windows 7
Delphi 2010
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
SetLength(db_archiv,5); // Legt Zeilenanzahl fest?
SetLength(db_archiv[z],10); // Legt ??? fest 
SetLength(db_archiv // keine Ahnung wies weitergeht


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 275

WinXP
BDS 2006
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41

Windows 7
Delphi 2010
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41

Windows 7
Delphi 2010
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: Mo 04.06.07 20:19 
Schaust du bei Christian vorbei. :lol:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Mo 04.06.07 20:31 
Warum so kompliziert?
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 275

WinXP
BDS 2006
BeitragVerfasst: Mo 04.06.07 20:33 
Hi,

ausblenden 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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
3DArray : T3DArray;
X, Y, Z : integer;

SetLength(3DArray, X, Y, Z); //Wenn mans so macht, dann hat jeder eintrag gleich viele untereinträge

SetLength(3DArray, X);
SetLength(3DArray[X - 1], Y);
SetLength(3DArray[X - 1, Y - 1], Z); //wenn man es so macht, dann kann man unterschiedlich viele untereinträge erzeugen


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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41

Windows 7
Delphi 2010
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  useranzahl := FResult.RowsCount;
  SetLength(db_archiv,useranzahl,9); // Z x X
  for z := 0 to useranzahl-1 do begin // Schleife für SQL Abfrage der einzelnen User
    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); // die 100 hab ich nur ausprobiert und schon kam ein Fehler
    end;
  end;
Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
  useranzahl := FResult.RowsCount;  
  SetLength(db_archiv, useranzahl, 9); // Z x X  
  for z := 0 to useranzahl-1 do // Schleife für SQL Abfrage der einzelnen User  
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41

Windows 7
Delphi 2010
BeitragVerfasst: 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 :P