2010-11-03 61 views
8

我想在Delphi 5.0中做一個ArrayList。於是,我找到了解決這樣的代碼:數組從Delphi 5.0 Pascal中的0或1開始?

var arr: array of String; 

OK,但每次我補充一點時間我這樣做:

var 
    Form1: TForm1; 
    var arr : array of String; 

procedure TForm1.Button1Click(Sender: TObject); 
var aux :string; 
var len:integer; 
begin 
    len := Length(arr) + 1; 
    SetLength(arr, len); 
    arr[len-1] := 'abc' + IntToStr(len); 
    Button1.Caption := arr[len-1]; // just to writeout something 
end; 

我是一個C++程序員,我不知道帕斯卡爾什麼。我總是聽說Pascal索引從1開始,而不是0.正如在上面的過程中,由於0索引開始,我做了arr [len-1]。

有沒有比Pascal數組更好的方法?與C++的std::vector一樣?

回答

34

動態數組索引零

開始
var 
    a: array of Integer; 
begin 
    SetLength(a, 500); 
    a[0] := 0; 

靜態陣列可以具有任意的索引

var 
    i: Integer; 
    b: array [50..100] of Integer; 
    c: array[-10..10] of Integer; 
begin 
    for i := 50 to 100 do b[i] := i * i; 

    // Note negative starting index above in declaration 
    for i := -10 to 10 do c[i] := i * i; 

字符串索引與一個

var 
    c: String; 
begin 
    c := 'Zap!'; 
    c[1] := 'W'; 
    ShowMessage(c); /// shows 'Wap!' 
開始3210

無論如何,您總是可以使用Low()和High()函數,它們返回數組的較低和較高索引。

爲了處理字符串列表中最常用的類是的TStringList這是在單位發現

+2

我很久沒有使用Pascal,但如果內存效果不錯,字符串索引從1開始的原因是因爲第一個元素是字符串長度,並且您可以直接編輯以更改長度 – 2014-05-27 04:43:44

+0

現在,此答案爲過時。在NextGen Delphi編譯器中,字符串索引是基於0的。 – jachguate 2014-09-19 16:43:41

+5

+ jachguate當問題是關於「Delphi 5.0 Pascal」的時候,爲什麼這個答案已經過時了? :-) – Trinidad 2014-09-19 17:19:35

10

你正在使用什麼被稱爲dynamic array這是不同於帕斯卡經典陣列。動態數組的大小是可變的,索引是基於0的。

經典Pascal數組不是基於0也不是基於...這取決於編程人員索引開始或結束的地方。唯一的編譯器限制是索引必須是序數類型。可以聲明

procedure x; 
    var 
     IntArr: array[50..75] of Integer; 
     StrArr: array[0..49] of string; 
     DblArr: array[1..10] of Double; 
+1

你確定那個「短宣言」嗎? – 2010-11-03 01:15:48

+1

也許你可以添加一個枚舉類型索引的數組,比如'array [TAlign] of ...'。 – 2010-11-03 01:16:51

+0

@Ulrich:你是對的......我從內存中說的_short_就是不能編譯的。我的答案現在已更新。 – jachguate 2010-11-03 01:26:19

6

的Delphi帕斯卡也有一個很好的功能,可幫助迭代通過任何尺寸的陣列:

i:= Low(Array) to High(Array) do.... 只需使用它是完全透明的起始即偏移0,1或5或隨你。

0

我試圖編輯上面的答案來改善它,但編輯不斷拒絕我的發佈。數組可以有負數索引。

var 
    A:array[-20..9] of integer; 
    B:array[-30..-10] of integer; 

這些都是相同的,爲20個整數的數組,但不會由編譯器,因爲索引範圍是不同的待處理的相同。允許您使數據適合問題域,而不是相反。現在

,像var S:string[200];字符串是技術上等同於​​其中字節0是除了當您使用的字符串沒有長度或指定的長度的長度大於255,則該字符串是1至它是任何當前大小。因爲字符串可以是動態的,所以依賴於第0個元素來包含長度並不好。

0

當您使用SetLength(array, length)時,值得一提的是它的索引從0開始直到長度爲1。在數組的pascal索引中也可以是ANSI表中的字符。所以你可以定義像a:array['A'..'Z'] of integer這樣的數組。當你需要使用字符串或字符數組中的所有字符時,這很方便。

相關問題