【问题标题】:Array begin from 0 or 1 in Delphi 5.0 Pascal?Delphi 5.0 Pascal中的数组从0或1开始?
【发布时间】:2010-11-03 00:48:08
【问题描述】:

我想在 Delphi 5.0 中做一个 ArrayList。所以我找到了执行此代码的解决方案:

var arr: array of String;

好的,但是每次我添加一些东西时,我都会这样做:

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 一无所知。我总是听说 Pascal 索引从 1 开始,而不是 0。在上面的过程中,我做 arr[len-1] 因为 0 索引开始。

有没有比 Pascal 数组更好的方法?和 C++ 的 std::vector 一样吗?

【问题讨论】:

    标签: arrays delphi pascal


    【解决方案1】:

    动态数组的索引从零开始

    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;
    

    字符串的索引以 1 开头

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

    无论如何,您始终可以使用返回数组的较低和较高索引的 Low() 和 High() 函数。

    为了处理字符串列表,最常用的类是 TStringList,它位于单元 Classes 中。

    【讨论】:

    • 好久没用Pascal了,如果记忆力好的话,字符串索引是从1开始的原因是因为第一个元素是字符串长度,可以直接编辑修改长度
    • +jachguate 当问题是关于“Delphi 5.0 Pascal”时,为什么这个答案已经过时了? :-)
    【解决方案2】:

    您使用的是 dynamic array,它不同于 Pascal 经典数组。动态数组大小可变,索引从 0 开始。

    经典 Pascal 数组不是基于 0 也不是基于 1...这取决于程序员的索引开始或结束的位置。唯一的编译器限制是索引必须是序数类型。你可以声明

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

    【讨论】:

    • 你确定那个“简短的声明”吗?
    • 也许你可以添加一个带有枚举类型索引的数组,比如array[TAlign] of ...
    • @Ulrich:你说得对……我凭记忆说的 short 无法编译。我的答案现在更新了。
    • ... 甚至array[boolean] of string = ( 'False', 'True' );
    • @MikeJ-UK 几年前我遇到它时,它以一种很好的方式让我感到惊讶。你也可以做array[byte]array[word]等等……在我看来很酷。
    【解决方案3】:

    Delphi Pascal 还有一个很好的功能,可以帮助遍历任意维度的数组:

    仅用于i:= Low(Array) to High(Array) do.... 这对于起始偏移量是完全透明的,即 0,1 或 5 或其他任何值。

    【讨论】:

      【解决方案4】:

      我试图编辑上述答案以改进它,但编辑一直拒绝我的帖子。数组可以有索引。

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

      它们都是相同的,一个包含 20 个整数的数组,但编译器不会将它们视为相同,因为索引范围不同。允许您使数据适合问题域,而不是相反。

      现在,像var S:string[200]; 这样的字符串在技术上等同于var s:packed array[0..200] of char,其中字节 0 是长度,除非您使用没有长度的字符串或指定长度大于 255,然后字符串为 1 到任何当前它的大小。因为字符串可以是动态的,所以依赖第 0 个元素来包含长度是不好的。

      【讨论】:

        【解决方案5】:

        当您使用SetLength(array, length) 时,值得一提的是,它的索引从0 开始直到长度为1。同样在数组的帕斯卡索引中,可以是 ANSI 表中的字符。所以你可以定义像a:array['A'..'Z'] of integer这样的数组。当您需要计算字符串或字符数组中的所有字符时,这会派上用场。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-20
          • 2012-01-21
          • 2013-12-15
          • 1970-01-01
          相关资源
          最近更新 更多