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] =
(
(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:

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 = 
(
(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 - 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..10..1of Single;

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


mfG,


zweistein12 - 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 - 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;
//[..]

//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,


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

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:

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: ;)

Delphi-Quelltext
1:
SetLength(MyArray, 66);                    
cu
Narses


Hidden - 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: ;)

Delphi-Quelltext
1:
SetLength(MyArray, 66);                    

Oh, man lernt nie aus :D
Danke,