Autor |
Beitrag |
Bockscar
      
Beiträge: 105
|
Verfasst: Mi 22.02.06 14:12
Folgendes Problem:
Delphi-Quelltext 1: 2: 3: 4: 5:
| a1: array[1..14] of 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..36] of 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 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
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Mi 22.02.06 14:46
Delphi-Quelltext 1: 2:
| var x: Array[1..123] of Array[1..456] of TType; |
Meinst du sowas?
AXMD
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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..13] of 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); SetLength(OberArray[1], 37); SetLength(OberArray[2], 42); |
_________________ 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 
      
Beiträge: 105
|
Verfasst: Fr 24.02.06 12:00
wenn ich dann folgendes schreibe:
Delphi-Quelltext
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..15] of integer=(1,37,40,73,97,99,111,112,133,143,148,149,151,153,9999,9999); ...
etc.
var overarray :array[1..36] of array[0..15] of integer;
...
constructor Tcroupier.create; begin overarray[1] := a1; end; |
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: Fr 24.02.06 12:02
Bockscar hat folgendes geschrieben: | wenn ich dann folgendes schreibe:
Delphi-Quelltext
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 
      
Beiträge: 105
|
Verfasst: 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..16] of 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
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 = () DynLengths: Array[0..13] of Integer = (13, 37, 42, ); 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.
|
|
|