Autor Beitrag
zweistein12
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 18.09.08 12:35 
Hallo
Ich möchte folgendes machen

ausblenden 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] =
(
(01),
(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:
ausblenden 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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  tMatrix : array of array of single
const
  arr = tMatrix = 
(
(01),
(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 user profile iconChristian S.: Delphi-Tags hinzugefügt
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type
  TMatix = Array[0..10..1of Single;

const
  Arr: TMatrix =
    ((01),
     (12));


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 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 19.09.08 10:16 
user profile iconHidden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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:
ausblenden 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;
//[..]

//Größe auf [0..5, 0..5] setzen:
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);

//bzw. mit Schleife:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 19.09.08 21:11 
Moin!

user profile iconzweistein12 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:
ausblenden volle Höhe 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+1mod LineLen) = 0then begin
      Memo1.Lines.Add(CommaText);
      Clear;
    end;
    end;
    if (Count > 0then
      Memo1.Lines.Add(CommaText);
  finally
    Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
  const
    ConstTest: array[0..3of 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;



user profile iconHidden 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:)



user profile iconHidden hat folgendes geschrieben:
man muss ihre Länge nämlich imho so initialisieren:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  MyArr: Array of Array of Integer;
//[..]

//Größe auf [0..5, 0..5] setzen:
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: ;)
ausblenden Delphi-Quelltext
1:
SetLength(MyArray, 66);					
cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Sa 20.09.08 11:40 
user profile iconNarses hat folgendes geschrieben:
Das ist sicher nicht nötig, SetLength() kann auch mehrere Dimensionen auf einmal initialisieren: ;)
ausblenden Delphi-Quelltext
1:
SetLength(MyArray, 66);					

Oh, man lernt nie aus :D
Danke,

_________________
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)