Autor |
Beitrag |
zweistein12
Hält's aus hier
Beiträge: 2
|
Verfasst: Do 18.09.08 12:35
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
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
zweistein12 
Hält's aus hier
Beiträge: 2
|
Verfasst: 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
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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  aber eindimensional ist doch OK, wenn man die Zeilenlänge mitgibt:
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.  (kann das überhaupt eine andere Programmiersprache?  )
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
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Sa 20.09.08 11:40
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
|