Delphi - 声明矩阵const

时间:2016-08-11 18:45:24

标签: delphi

编辑我的问题。

我具体。

如何将以下代码声明为const而不是var? (我无法获得Cube示例)

 var
 Matrix : array of array of string;

 SetLength(Matrix, 8, 8);
 Matrix[0,0]:='A0';Matrix[0,1]:='A1';Matrix[0,2]:='A2';Matrix[0,3]:='A3';Matrix[0,4]:='A4';Matrix[0,5]:='A5';Matrix[0,6]:='A6';Matrix[0,7]:='A7';
 Matrix[1,0]:='B0';Matrix[1,1]:='B1';Matrix[1,2]:='B2';Matrix[1,3]:='B3';Matrix[1,4]:='B4';Matrix[1,5]:='B5';Matrix[1,6]:='B6';Matrix[1,7]:='B7';
 Matrix[2,0]:='C0';Matrix[2,1]:='C1';Matrix[2,2]:='C2';Matrix[2,3]:='C3';Matrix[2,4]:='C4';Matrix[2,5]:='C5';Matrix[2,6]:='C6';Matrix[2,7]:='C7';
 Matrix[3,0]:='D0';Matrix[3,1]:='D1';Matrix[3,2]:='D2';Matrix[3,3]:='D3';Matrix[3,4]:='D4';Matrix[3,5]:='D5';Matrix[3,6]:='D6';Matrix[3,7]:='D7';
 Matrix[4,0]:='E0';Matrix[4,1]:='E1';Matrix[4,2]:='E2';Matrix[4,3]:='E3';Matrix[4,4]:='E4';Matrix[4,5]:='E5';Matrix[4,6]:='E6';Matrix[4,7]:='E7';
 Matrix[5,0]:='F0';Matrix[5,1]:='F1';Matrix[5,2]:='F2';Matrix[5,3]:='F3';Matrix[5,4]:='F4';Matrix[5,5]:='F5';Matrix[5,6]:='F6';Matrix[5,7]:='F7';
 Matrix[6,0]:='G0';Matrix[6,1]:='G1';Matrix[6,2]:='G2';Matrix[6,3]:='G3';Matrix[6,4]:='G4';Matrix[6,5]:='G5';Matrix[6,6]:='G6';Matrix[6,7]:='G7';
 Matrix[7,0]:='H0';Matrix[7,1]:='H1';Matrix[7,2]:='H2';Matrix[7,3]:='H3';Matrix[7,4]:='H4';Matrix[7,5]:='H5';Matrix[7,6]:='H6';Matrix[7,7]:='H7';

2 个答案:

答案 0 :(得分:6)

代码中的具体问题是您声明的数组是动态。也就是说,边界不是固定的,可以在运行时更改。

在旧版本的Delphi(XE6及更早版本)中,根本不可能声明动态数组常量。在XE7及更高版本中,它是可能的,但语法与固定数组常量不同。

在所有版本中,如果声明一个具有指定(因此是固定的)边界的常量数组,则可以指定常量数组的内容:

const
  Matrix : array[0..7, 0..7] of String = 
   (
    ('A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7'),
    ('B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7'),
    ('C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7'),
    ('D0', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7'),
    ('E0', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7'),
    ('F0', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7'),
    ('G0', 'G1', 'G2', 'G3', 'G4', 'G5', 'G6', 'G7'),
    ('H0', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'H7')
   );

如果你的数组需要在早于XE6的Delphi版本中是动态的,那么你不能使用这样的声明来初始化这样的数组。

如果您使用的是Delphi XE7或更高版本,则可以使用备用语法声明动态数组常量。这与固定数组常量的语法非常相似,但使用方括号[]而不是常规括号()

 const
   Matrix : array of array of String =
   [
    ['A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7'],
    ['B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7'],
    ['C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7'],
    ['D0', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7'],
    ['E0', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7'],
    ['F0', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7'],
    ['G0', 'G1', 'G2', 'G3', 'G4', 'G5', 'G6', 'G7'],
    ['H0', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'H7']
   ];

旧版Delphi版本的混合解决方案

如果您使用的是较旧版本的Delphi,那么即使使用动态数组,如果您有一些初始状态(边界和内容),您希望将其初始化,那么您可以使用固定数组常量< / strong>定义初始状态,然后在运行时从该常量初始化动态数组,如:

const
  MX_DIM  = 8;
  MX_DEFAULT : array[0..MX_DIM - 1, 0..MX_DIM - 1] of String =
   (
    ('A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7'),
    ('B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7'),
    ('C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7'),
    ('D0', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7'),
    ('E0', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7'),
    ('F0', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7'),
    ('G0', 'G1', 'G2', 'G3', 'G4', 'G5', 'G6', 'G7'),
    ('H0', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'H7')
   );

// Then in your code:

var
  x, y: Integer;
  Matrix: array of array of String;
begin
  // Initialise 'Matrix' from MX_DEFAULT:

  SetLength(Matrix, MX_DIM, MX_DIM);
  for x := 0 to Pred(MX_DIM) do
    for y := 0 to Pred(MX_DIM) do
      Matrix[x, y] := MX_DEFAULT[x, y];
end;

答案 1 :(得分:5)

documentation显示了如何声明常量数组

  

数组常量

     

要声明数组常量,请包含元素的值   数组,以逗号分隔,在括号末尾的括号中   宣言。这些值必须由常量表达式表示。   例如:

const Digits: array[0..9] of Char =
  ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
     

声明一个名为Digits的类型常量,它包含一个数组   字符。

     

要定义多维数组常量,请将值括起来   每个维度在一组单独的括号中,以逗号分隔。   例如:

type 
  TCube = array[0..1, 0..1, 0..1] of Integer;

const 
  Maze: TCube = (((0, 1), (2, 3)), ((4, 5), (6,7)));
     

创建一个名为Maze的数组,其中:

Maze[0,0,0] = 0
Maze[0,0,1] = 1
Maze[0,1,0] = 2
Maze[0,1,1] = 3
Maze[1,0,0] = 4
Maze[1,0,1] = 5
Maze[1,1,0] = 6
Maze[1,1,1] = 7

这些示例适用于一维和三维数组。对于二维数组,它将是:

const
  Coords: array [0..2, 0..2] of string = (
    ('A0', 'A1', 'A2'),
    ('B0', 'B1', 'B2'),
    ('C0', 'C1', 'C2'),
  );