Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Zwei-Dimensionales Array als Parameter, aber...
zweistein12 - Do 18.09.08 12:35
Titel: Zwei-Dimensionales Array als Parameter, aber...
Hallo
Ich möchte folgendes machen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure Proc(); const arr = array[1..2][1..2] = ( (0, 1), (0 ,2) );
begin Interpolate(0.2, arr); end;
function Interpolate(const bezug:single; matrix:MAGISCHER TYP):single; begin result := hier wilde Berechnung auf matrix end; |
wichtig ist für mich das array wie oben angegeben schreiben zu können, also als Konstante.
Was Geht ist:
Delphi-Quelltext
1: 2: 3:
| statt array[1..2][1..2] = einen Typ zu verwenden: type tMatrix : array of array of single |
diesen dann zur Laufzeit mit den Werten füllen und Interpolate erwartet diesen Typ dann.
Es geht leider nicht
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| type tMatrix : array of array of single const arr = tMatrix = ( (0, 1), (0 ,2) ); |
Im Prinzip reicht ja auch die Umwandlung eines zwei-dimensionalen statischen Arrays in ein zwei Dimensionalen offenes Array. Ein-Dimensional geht das ja wunderbar mit
function Interpolate(arr:array of single):single;
Zwei-Dimensional nur leider nicht.
Das ganze soll mit Delphi 7 gehen. Wenn es mit einer neueren Version geht, reicht mir auch diese Information.
Vielen Dank.
Moderiert von
Christian S.: Delphi-Tags hinzugefügt
Hidden - Do 18.09.08 16:26
Hi,
Erstmal(denke ich) wolltest du Matrix wohl eher als Array[0..1, 0..1] of Single deklarieren, oder? Oder sollen die variabel groß sein? Dann musst du die Größe zuerst mit SetLength() bestimmen, wenn du eines erzeugst.
Ich würde dir generell eher 0..1 als 1..2 empfehlen, die meißten Arrays(außer Strings) beginnen mit dem Index null.
Also imho so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| type TMatix = Array[0..1, 0..1] of Single;
const Arr: TMatrix = ((0, 1), (1, 2)); |
mfG,
zweistein12 - Fr 19.09.08 10:16
Hidden hat folgendes geschrieben: |
Hi,
Erstmal(denke ich) wolltest du Matrix wohl eher als Array[0..1, 0..1] of Single deklarieren, oder?
|
Ja natürlich
Zitat: |
Oder sollen die variabel groß sein? Dann musst du die Größe zuerst mit SetLength() bestimmen, wenn du eines erzeugst. |
Auch das, das Array was in der Prozedur deklariert wird, soll unterschiedeliche groß sein können.
Die Funktion interpolate soll praktisch auf allen Arrays arbeiten können. Egal wie die deklariert wurden. Diese Funktion verändert das Array aber nicht, also keine Gefahr bei konstanten Arrays.
Zitat: |
Ich würde dir generell eher 0..1 als 1..2 empfehlen, die meißten Arrays(außer Strings) beginnen mit dem Index null.
|
Ok, damit könnte ich leben, es dem Geschäftsfall ergibt sich das zwar nicht, aber ok.
Hidden - Fr 19.09.08 17:30
Hi,
Das Problem bei variabel großen, mehrdimensionalen Arrays liegt hier, man muss ihre Länge nämlich imho so initialisieren:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| type MyArr: Array of Array of Integer;
SetLength(MyArray, 6); SetLength(MyArray[0], 6); SetLength(MyArray[1], 6); SetLength(MyArray[2], 6); SetLength(MyArray[3], 6); SetLength(MyArray[4], 6); SetLength(MyArray[5], 6);
const Laenge = 6;
procedure InitArr; var i: Integer; begin SetLength(MyArray, Laenge); for i := 0 to Laenge - 1 do SetLength(MyArray[i], Laenge); |
mfG,
Narses - Fr 19.09.08 21:11
Moin!
zweistein12 hat folgendes geschrieben: |
Im Prinzip reicht ja auch die Umwandlung eines zwei-dimensionalen statischen Arrays in ein zwei Dimensionalen offenes Array. Ein-Dimensional geht das ja wunderbar mit
function Interpolate(arr:array of single):single;
Zwei-Dimensional nur leider nicht. |
AFAIK geht das auch tatsächlich nicht :nixweiss: aber eindimensional ist doch OK, wenn man die Zeilenlänge mitgibt: :idea:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| procedure TForm1.Dump(const Data: array of Single; const LineLen: Integer); var i: Integer; begin with TStringList.Create do try for i := 0 to High(Data) do begin Add(FloatToStr(Data[i])); if (((i+1) mod LineLen) = 0) then begin Memo1.Lines.Add(CommaText); Clear; end; end; if (Count > 0) then Memo1.Lines.Add(CommaText); finally Free; end; end;
procedure TForm1.Button1Click(Sender: TObject); const ConstTest: array[0..3] of Single = ( 0,1,2,3 ); var VarTest: array of Single; i: Integer; begin Dump(ConstTest,2); SetLength(VarTest,9); for i := 0 to High(VarTest) do VarTest[i] := i; Dump(VarTest,3); end; |
Hidden hat folgendes geschrieben: |
Das Problem bei variabel großen, mehrdimensionalen Arrays |
Ich denke, es geht hier um mehrdimensionale,
offene Array-Parameter; und das kann Delphi AFAIK nicht. :nixweiss: (kann das überhaupt eine andere Programmiersprache? :gruebel:)
Hidden hat folgendes geschrieben: |
man muss ihre Länge nämlich imho so initialisieren: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| type MyArr: Array of Array of Integer;
SetLength(MyArray, 6); SetLength(MyArray[0], 6); SetLength(MyArray[1], 6); | |
Das ist sicher nicht nötig, SetLength() kann auch mehrere Dimensionen auf einmal initialisieren: ;)
Delphi-Quelltext
1:
| SetLength(MyArray, 6, 6); |
cu
Narses
Hidden - Sa 20.09.08 11:40
Narses hat folgendes geschrieben: |
Das ist sicher nicht nötig, SetLength() kann auch mehrere Dimensionen auf einmal initialisieren: ;)
Delphi-Quelltext 1:
| SetLength(MyArray, 6, 6); | |
Oh, man lernt nie aus :D
Danke,
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!