Entwickler-Ecke

Sonstiges (Delphi) - Array aus arrays auf diese Weise?


Bockscar - Mi 22.02.06 14:12
Titel: Array aus arrays auf diese Weise?
Folgendes Problem:



Delphi-Quelltext
1:
2:
3:
4:
5:
a1: array[1..14of integer=(1,37,40,73,97,99,111,112,133,143,148,149,151,153);
a2: array[1..?] of integer=(x,y,z...);
...

overarray :array[1..36of array = [a1,a2,a3,a4 ...]


Wie kann ich diese Deklaration richtig machen?? Geht sowas überhaupt, oder müssen die arrays dafür eine einheitliche länge haben?


Ich brauche es für die folgende Funktion:
Ich versuche die Prozedur im folgenden zu erläutern, damit ihre Aufgabe verständlich wird.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure Tcroupier.check_win(number :integer);
var win,lauf :integer;
begin
//Für Player1
win := 0;

for lauf := 1 to length(overarray[number]) do
begin
 case overarray[number][lauf] of
 0..36   : win := win + 35*player1_bets[overarray[number][lauf]];
 37..96  : win := win + 18*player1_bets[overarray[number][lauf]];
 97..110 : win := win + 12*player1_bets[overarray[number][lauf]];
 111..132: win := win + 9*player1_bets[overarray[number][lauf]];
 133..142: win := win + 6*player1_bets[overarray[number][lauf]];
 143..148: win := win + 3*player1_bets[overarray[number][lauf]];
 149..154: win := win + 2*player1_bets[overarray[number][lauf]];
 end;
end;
...

end;


Eine number wird an die funktion übergeben.
Die Forschleife läuft soviele Male wie overarray[number] elemente hat.

Also bei 1 als Nummer soll overarray[1] (also den array 'a1') nehmen und 14mal die forschleife durchlaufen (anzahl der elemente in a1!)





Ich hoffe mir kann jemand meine Frage beantwroten und danke im voraus!

gruß


AXMD - Mi 22.02.06 14:46


Delphi-Quelltext
1:
2:
var
  x: Array[1..123of Array[1..456of TType;


Meinst du sowas?

AXMD


BenBE - Mi 22.02.06 15:40

Jup, sowas ist möglich, wenn Du deine Sub-Arrays dynamisch deklarierst:


Delphi-Quelltext
1:
2:
Var
    OberArray : Array[0..13of Array of Integer;


Allerdings geht dann keine Vorinitialisierung mehr.

Diese müsste dann etwa so aussehen:


Delphi-Quelltext
1:
2:
3:
4:
SetLength(OberArray[0], 13); //Erstes Array ist 13 Elemente lang (von 0 bis 12!!!)
SetLength(OberArray[1], 37); //Zweites Array ist 37 Elemente lang (von 0 bis 36!!!)
SetLength(OberArray[2], 42); //Drittes Array ist 42 Elemente lang (von 0 bis 41!!!)
{...}


Bockscar - Fr 24.02.06 12:00

wenn ich dann folgendes schreibe:


Delphi-Quelltext
1:
overarray[1] := a1                    


bekomme ich die meldung
[Fehler] Unitcroupier.pas(111): Inkompatible Typen: 'Array' und 'dynamic array'


Und folgendes geht auch nicht:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
const
a1: array[0..15of integer=(1,37,40,73,97,99,111,112,133,143,148,149,151,153,9999,9999);
...

etc.

var overarray :array[1..36of array[0..15of integer;

...

 constructor Tcroupier.create;
 begin
 //Alle Gewinnchance_arrays initialisieren
 {setlength(overarray[1],16);}
 overarray[1] := a1;
 end;


AXMD - Fr 24.02.06 12:02

user profile iconBockscar hat folgendes geschrieben:
wenn ich dann folgendes schreibe:


Delphi-Quelltext
1:
overarray[1] := a1                    


bekomme ich die meldung
[Fehler] Unitcroupier.pas(111): Inkompatible Typen: 'Array' und 'dynamic array'


Es muss auch overarray[1][1] := a1 lauten... und nebenbei: dynamische Arrays (sofern du solche verwendest) fangen immer beim Index 0 an.

AXMD


Bockscar - Fr 24.02.06 12:10

mmh ok klar. danke.

jetzt sagt er mir allerdings folgendes

[Fehler] Unitcroupier.pas(111): Inkompatible Typen: 'Integer' und 'Array'

bei overarray[1][1] := a1;


die deklaration steht oben. habe anstelle von dynamischen arrays einfach alle arrays gleichlang gemacht und den rest den man nicht braucht mit nem hohen integerwert gefüllt


Delphi-Quelltext
1:
a1: array[1..16of integer=(1,37,40,73,97,99,111,112,133,143,148,149,151,153,9999,9999);                    


die array unterscheiden sich naemlcih nur in der laenge um 1-5.


AXMD - Fr 24.02.06 12:22

Ups, sorry, hab zu ungenau gelesen. Du kannst nicht ein Array direkt zuweisen. Das musst du (leider) mit einer for-Schleife machen.

AXMD


BenBE - Fr 24.02.06 12:43

Im Zusammenhang mit dynamischen Arrays zur Speicherung möchte ich deine Aufmerksamkeit noch einmal ganz freundlich auf meinen Beitrag weiter oben lenken. Mit diesem Hinweis bekommst Du für die Initialisierung deiner dynamischen Arrays den nötigen Speicher zugewiesen und müsstest danach nur noch die eigentlichen Werte zuzuweisen.

@AXMD: Es gibt noch eine weitere Möglichkeit, die Werte schnell zuzuweisen, die ist aber nicht Anfängertauglich ;-)

Übrigens kann man auch das so erzeugte dynamische Array ohne großen Aufwand initalisieren:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
const 
    DataArray: Array[0..???] of Integer = ({...}//Deine Rohdaten
    DynLengths: Array[0..13of Integer = (133742{...}); //Längen der Unter-Arrays
var
    X, Y, Z: Integer;

Z := 0;
for X := Low(DynLengths) TO High(DynLengths) Do
Begin
    SetLength(OberArray[X], DynLengths(X]);
    For Y := 0 To DynLengths(X] - 1 Do
        OberArray[X][Y] := DataArray[Z+Y];
    Z := Z + DynLengths(X];
end;


Syntaxfehler zur Übung einbegriffen.