Autor Beitrag
Bockscar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 105



BeitragVerfasst: Mi 22.02.06 14:12 
Folgendes Problem:


ausblenden 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mi 22.02.06 14:46 
ausblenden Delphi-Quelltext
1:
2:
var
  x: Array[1..123of Array[1..456of TType;


Meinst du sowas?

AXMD
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 22.02.06 15:40 
Jup, sowas ist möglich, wenn Du deine Sub-Arrays dynamisch deklarierst:

ausblenden 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:

ausblenden 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!!!)
{...}

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Bockscar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 105



BeitragVerfasst: Fr 24.02.06 12:00 
wenn ich dann folgendes schreibe:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Fr 24.02.06 12:02 
user profile iconBockscar hat folgendes geschrieben:
wenn ich dann folgendes schreibe:

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



BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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:

ausblenden 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.