首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我可以在Delphi/Pascal中一次分配数组中的所有项吗?

我可以在Delphi/Pascal中一次分配数组中的所有项吗?
EN

Stack Overflow用户
提问于 2011-06-27 21:38:31
回答 8查看 26.4K关注 0票数 19

我想用PHP、Python和大多数其他编程语言做一些类似的事情:

代码语言:javascript
复制
my_array_name = [128, 38459, 438, 23674...] 

所以我尽量用Delphi/Pascal来复制:

代码语言:javascript
复制
HSVtoRGB := [0, 0, 0];

(这适用于返回给定HSV值的RGB数组的函数。)

但是我得到了一些错误:

代码语言:javascript
复制
[DCC Error] Unit2.pas(44): E2001 Ordinal type required
[DCC Error] Unit2.pas(45): E2010 Incompatible types: 'HSVRealArray' and 'Set'

有什么想法吗?这是作业--但是我的老师不知道答案。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-06-27 21:40:56

当涉及到动态数组时,是的:

代码语言:javascript
复制
type
  TIntArray = array of integer;

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

当涉及到静态数组时,您需要编写一个辅助函数:

代码语言:javascript
复制
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;

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

票数 21
EN

Stack Overflow用户

发布于 2011-06-27 22:27:42

这是Delphi将大多数语言中简单的单行赋值语句转换为更复杂语句的领域。

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

代码语言:javascript
复制
type
  HSVRealArray = array[1..3] of real;
const
  constHSVVal: HSVRealArray = (0, 0, 0);
var
  currentValue: HSVRealArray;
begin
  currentValue := constHSVVal;
end;

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

代码语言:javascript
复制
function MakeHSVRealArray(H, S, V: Real): HSVRealArray;
begin
  Result[1] := H;
  Result[2] := S;
  Result[3] := V;
end;

currentValue := MakeHSVRealArray(0,0,0);
票数 10
EN

Stack Overflow用户

发布于 2011-06-27 23:32:40

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

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

代码语言:javascript
复制
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;

这样使用它:

代码语言:javascript
复制
 var MyArray: TRealStaticArray;
 ...
 MyArray := RealArray([10.0, 20.0, 30.0]);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6493727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档