EBSILON®Professional Online Documentation
本主题中
    数组
    本主题中

    数组

    处理数组的选项:

    • 静态赋值:
      例如:b:=[3,4,6,9];
    • 直接赋值(a 和 b 是数组):
      例如:a:=b;
    • 测试是否相等(a 和 b 是数组):
      例如:if (a=b) then ...
    • 数组(也包括记录)可以在函数中作为返回类型使用。
    • 在函数调用中,数组可以被"按值"转发。然后,数组的完整副本被推入堆栈。
      数组也可以"通过引用"转发(使用关键字 var)。

      例如:

      procedure modify (var s_arr: array[13..17] of integer);
      begin
           s_arr[15]:= 151515;
      end;
      procedure try_modify (s_arr: array[13..17] of integer);
      begin
           s_arr[15]:= 151515;
      end;

      procedure PrintSA (s_arr: array[13..17] of integer);
      var k:integer;
      begin
          print ("Integer array of length ", length (s_arr), ": ");
          for k := 13 to 17 do
             print (k,":", s_arr[k], ", ");
          print ("\n");
      end;

      var s_arr: array [13..17] of integer;
      begin
          s_arr[13] := 13;
          s_arr[14] :=-14;
          s_arr[15] := 15;
          s_arr[16] :=-16;
          s_arr[17] := 17;
          try_modify (s_arr);
          PrintSA (s_arr);
          modify (s_arr);
          PrintSA (s_arr);
      end.
    Integer array of length 5: 13:13, 14:-14, 15:15, 16:-16, 17:17
    Integer array of length 5: 13:13, 14:-14, 15:151515, 16:-16, 17:17

    有三种类型的数组:

     

    对于静态数组,有以下这些函数:

    名称

    目的 

    参数 

    返回值 

    例子

    high

    得出最后一个数组元素的索引

    如果数组是多维度的,则使用第一个索引 

    1: 数组

    INTEGER

    i:=high (array);

     

    length

    得出数组的长度

    1: 数组

    INTEGER

    a:array [1..10] of array [2..5] of integer;
    b:array [1..10, 2..5] of integer;

    e. g.  length(a)==length(b)==10

    but length(a[1])==length(b[1])==4

    low

    得到第一个数组元素的索引

    1: 数组

    INTEGER

    i:=low (array);

    对于动态数组,有以下这些函数:

    名称

    目的 

    参数 

    返回值 

    例子

    append

    将一个数组或一个数组元素追加到另一个数组中 第 11 版起也允许追加单个元素

     

    1:: 数组: Dest=动态数组
    2: 数组或数组元素: Source

     

    capacity

    产生动态数组在不自动分配内存的情况下可以获得的最大元素数(不需要与数组长度相匹配)。

    1: 数组: Source

    INTEGER

     i:=capacity(arObjects);

    copy

    将一个数组复制到另一个数组上

    1: 数组: Source

    数组: Dest

     

    high

    得到最后一个数组元素的索引

    1: 数组

    INTEGER

    i:=high (arObjects);

    insert

    将一个数组或一个数组元素插入另一个数组的某一位置。
    第 11 版起也允许插入单个元素

    1: 数组: Dest=动态数组
    2: 数组或数组元素: Source
    3: INTEGER: 位置

     

    length

    得到数组的长度

    1: 数组

    INTEGER

     

    low

    得到第一个数组元素的索引

    1: 数组

    INTEGER

    i:=low (arObjects);

    remove

    从一个数组中删除某些元素

    1: 数组: 动态数组
    2: INTEGER: 起始位置
    3: INTEGER: 元素数量

     

    reserve

    分配存储空间给一个数组中一定数量的元素(不创建或删除任何元素,只保留必要的存储空间)。

    1: 数组: 动态数组
    2: INTEGER: 元素数量

     reserve(arObjects,100);

    setLength

    将数组的长度设置为一个新的值

    1: 数组: 动态数组
    2: INTEGER: 新长度

    var dyn_arr: array of real;
    setLength (dyn_arr, 2);
    dyn_arr[0]:= -45.7;
    dyn_arr[1]:=  5.7;

    reserve

    第 11 版起允许为数组中给定数量的元素预留最小的内存(请注意:没有元素被创建或删除,但只有所需的内存被预留)预留并不取代对 setLength 的调用)-该函数可用于长期优化,可用于避免不必要的数组内存的重新分配                

    1: 动态数组

    2: INTEGER: 要预留的项的数量

     

    var arr: array of string;
             i: integer;
    begin
             reserve( arr, 2000000);      
             println(capacity(arr));
             for i:=0 to 1999999 do

             begin
             setLength(arr, i+1);
             arr[i] := string(i);
             end;

             println("finished");

    end.  

     

    capacity

    第 11 版起返回数组所能包含的最大元素数目,而不会自动创建新的内存

     1: 动态数组

     

    见 reserve

     

    对于开放数组,有以下这些函数:

    名称

    目的 

    参数 

    返回值 

    例子

    setLow

    设置第一个元素的索引

    1: 数组 *
    2: INTEGER: 新索引

    数组 *

    procedure PrintCA (a: array * of char);
    var k:integer;
    begin
        print ("Char array of length ", length (a), ": ");
        for k := low  (a) to high (a) do
           print (k,":", a[k], ", ");
       print ("\n");
    end;

    var dyn_c: array of char;
    begin 
       setLength (dyn_c, 5);
       dyn_c[0]:= 'x';  dyn_c[1]:= '真';
       dyn_c[2]:= 'ü';   dyn_c[3]:= '仿';
       dyn_c[4]:= 'ê';

        PrintCA (dyn_c);
        PrintCA (setlow (dyn_c,-10));
       PrintCA (sliceLeft (dyn_c,3));
       PrintCA (sliceRight(dyn_c,2));
       PrintCA (sliceMid  (dyn_c,1,4));
    end.

    sliceLeft

    得到一个数组的第 n 个元素

    1: 数组
    2: INTEGER: 元素的数量

    数组 *

    sliceMid

    得到从某一位置开始的数组的第 n 个元素

    1: 数组
    2: INTEGER: 第一个索引
    3: INTEGER: 元素的数量

    数组 *

    sliceRight

    得到一个数组的最后 n 个元素

    1: 数组
    2: INTEGER: 元素的数量

    数组 *