我可以在Delphi/Pascal中一次性分配数组中的项目吗?

Tho*_*s O 17 delphi syntax

我想做一些像PHP,Python和大多数其他编程语言的东西:

my_array_name = [128, 38459, 438, 23674...] 
Run Code Online (Sandbox Code Playgroud)

所以我尽力在Delphi/Pascal中复制它:

HSVtoRGB := [0, 0, 0];
Run Code Online (Sandbox Code Playgroud)

(这是针对给定HSV值返回RGB数组的函数.)

但是我收到了错误:

[DCC Error] Unit2.pas(44): E2001 Ordinal type required
[DCC Error] Unit2.pas(45): E2010 Incompatible types: 'HSVRealArray' and 'Set'
Run Code Online (Sandbox Code Playgroud)

任何的想法?这是学校的工作 - 但我的老师不知道答案.

And*_*and 19

说到动态数组,是的:

type
  TIntArray = array of integer;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyArr: TIntArray;
begin
  MyArr := TIntArray.Create(10, 20, 30, 40);
end;
Run Code Online (Sandbox Code Playgroud)

说到静态数组,你需要编写一个辅助函数:

type
  TIntArray = array[0..2] of integer;

function IntArray(const A, B, C: integer): TIntArray;
begin
  result[0] := A;
  result[1] := B;
  result[2] := C;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyArr: TIntArray;
begin
  MyArr := IntArray(10, 20, 30);
end;
Run Code Online (Sandbox Code Playgroud)

这类似于Point函数创建TPoint记录的方式.(但记录和数组并不是一回事.)

  • @Andriy既然你知道固定大小的数组有多少,那么在编译时进行检查会更好. (2认同)
  • "标准"辅助函数(与开放式数组辅助函数相对)的另一个好处是它告诉程序员以什么顺序指定红色,绿色和蓝色组件. (2认同)

Dan*_*ett 9

在这个领域,Delphi将大多数语言中简单的单行赋值语句转换为更复杂的东西.

一种方法是将值声明为类型常量:

type
  HSVRealArray = array[1..3] of real;
const
  constHSVVal: HSVRealArray = (0, 0, 0);
var
  currentValue: HSVRealArray;
begin
  currentValue := constHSVVal;
end;
Run Code Online (Sandbox Code Playgroud)

另一种方法是创建返回所需类型的实用程序函数:

function MakeHSVRealArray(H, S, V: Real): HSVRealArray;
begin
  Result[1] := H;
  Result[2] := S;
  Result[3] := V;
end;

currentValue := MakeHSVRealArray(0,0,0);
Run Code Online (Sandbox Code Playgroud)

  • +1表示Delphi语法在这方面很弱的事实 (3认同)

mar*_*_ja 5

通过一些额外的工作,您可以实现一个干净的实现:

var
    x: TRGB;
begin
    x := TRGB.Init(0,0,0);
end;
Run Code Online (Sandbox Code Playgroud)
TRGB = record
    Red, Green, Blue: real;
    class function Init(r,g,b: real): TRGB; static;
end;

class function TRGB.Init(r, g, b: real): TRGB;
begin
    Result.Red := r;
    Result.Green := g;
    Result.Blue := b;
end;
Run Code Online (Sandbox Code Playgroud)

  • 如果您将其声明为“构造函数 Init(...);”,那么您可以灵活地将其用作函数:“x := TRGB.Init(...);”或用作初始化现有的过程实例:`x.Init(...);` (2认同)

PA.*_*PA. 5

对于数组处理、数组初始化和数组常量声明,Delphi 并没有让简单的事情变得简单。

在某些与您类似的情况下,我使用一个实用函数来初始化数组,该函数采用一个开放数组参数并返回适当的静态字符串。

const
    MaxArray = 10;
type
    TRealStaticArray = array[0..MaxArray] of Real;

function RealArray(const AnArray: array of real):TRealStaticArray;
    const DefaultValue=0.0;
    var i: integer;
    begin
        // EDIT: commented out, thanks Serg. for i:= 0 to low(AnArray)-1 do result[i]:=DefaultValue;
        for i:= High(AnArray)+1 to MaxArray do
            result[i]:=DefaultValue;
        for i:= Low(AnArray) to High(AnArray) do
            if (i>=0) and (i<=MaxArray) then
                result[i]:=AnArray[i];
    end;
Run Code Online (Sandbox Code Playgroud)

这样使用它:

 var MyArray: TRealStaticArray;
 ...
 MyArray := RealArray([10.0, 20.0, 30.0]);
Run Code Online (Sandbox Code Playgroud)


LU *_* RD 5

Delphi-XE7 引入了新的dynamic array初始化语法。

// compile time const declaration of dynamic array
const
  my_ConstArray_name: TArray<Integer> = [128, 38459, 438, 23674];

// compile time var declaration of dynamic array
var
  my_VarArray_name: TArray<Integer> = [128, 38459, 438, 23674];
Run Code Online (Sandbox Code Playgroud)

动态数组的运行时赋值:

var
  a : TArray<Integer>;
begin
  a := [1,2,3];
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种语法不能用于普通的静态数组:

Type
  TMyArray = array[0..3] of Integer;  

const
  cMyArray: TMyArray = [0,1,2,3]; // E2010 Incompatible types: 'TMyArray' and 'Set'
  cMyArray: TMyArray = (0,1,2,3); // Works, as in all Delphi versions

var
  MyArray: TMyArray;
begin
  // This fails as well
  MyArray := [0,1,2,3]; // E2010 Incompatible types: 'TMyArray' and 'Set'
  MyArray := (0,1,2,3); // E2029 ')' expected but ',' found  
  //-----------^-------

  // This works in all Delphi versions !
  MyArray := cMyArray;
Run Code Online (Sandbox Code Playgroud)