2016-04-28 18 views
-3
unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; 

type 
    StaticArray = Array[0..1000] of Double; 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 
    DArray: Array of StaticArray; 
    Length : Integer; 

implementation 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
Length:=5; 
Setlength(DArray, Length); 
end; 

end. 

Wenn ich versuche Setlänge() zu verwenden, um die Länge des 2DArray zu definieren, gibt es mir keinen Fehler oder nichts.Delphi Verwenden eines 2d-Arrays definiert durch statische Array

Ich erwarte, dass das Ergebnis ein Array mit 1000 Spalten und Länge Anzahl der Zeilen sein wird. Allerdings ist das Ergebnis nur 1 Zeile mit 1001 Spalten.

Irgendeine Idee warum?

Ich brauche das Array auf diese Weise definiert werden, aber ich bin fest, wie man die Länge des Array festlegen.

* Anzahl der Spalten bearbeiten, 0..1000, was zu 1001 Spalten addiert.

* Edit2 Der Code ein wenig mehr behoben.

* Edit3 Hergestellt ein besseres Beispiel

+1

StaticArray hat 1001 Elemente, nicht 1000, FWIW. Und ja, 2DArray ist 2D, 1001 * Länge. Sie haben nicht annähernd genug Code gezeigt, um Ihr Problem zu diagnostizieren. Wir brauchen einen [MCVE]. –

+0

Es funktioniert gut für mich in Delphi Berlin, mit Ausnahme des zusätzlichen Elements, das David erwähnt. Eine 10-Zeilen-Konsolenanwendung, die eine WriteLn der Länge (MyArray) und der Länge (MyArray [10]) ausführt, zeigt, dass sie beide vorhanden sind und über die entsprechenden Werte verfügen. –

+0

Warum postest du nicht zuerst deinen echten Code? Das obige kompiliert nicht. 'Länge' ist nirgendwo deklariert oder zugewiesen, und die Deklaration von' StaticArray' ist ebenfalls falsch. –

Antwort

1

ich Ihren Code überprüft haben, links absichtlich die gleiche ID Length. Code funktioniert wie erwartet:

procedure TForm1.Button20Click(Sender: TObject); 
type 
    StaticArray = Array[0..1000] of Double; 
var 
    DArray: Array of StaticArray; 
    Length : Integer; 
begin 
    Length := 5; 
    SetLength(DArray, Length); 
    Caption := IntToStr(High(DArray)); //ouputs 4 

    //note bad usage of Length var, so we can not use Length intrinsic function 

    DArray[3, 1000] := 42; 
end; 
+0

Vielen Dank, MBo, dass Sie sich die Zeit genommen haben, sich das genauer anzusehen. Der Code sieht gut aus. Ich denke, es ist mein Debugger-Inspektor, der mir die Array-Größe falsch angibt. Siehe [Bild] (https://i.imgur.com/fvyxlCl.png). Wenn ich meine Maus darüber bewege, werden die 5 Zeilen richtig angezeigt. – Monin

+0

Beachten Sie, dass 'Complete, und Verifyable example' von Ihnen helfen könnte, das Problem sehr schnell zu lösen. Und bitte vermeiden Sie 'Length'-Identifikator - es ist sehr wichtig intrinsische Funktion (aber leider ist der Name nicht reserviert). – MBo

+0

Während Length die Funktion Length() ausblendet, greifen Sie immer noch auf Letzteres als System.Length() zu. –