我想做一些像PHP,Python和大多数其他编程语言的东西:
my_array_name = [128, 38459, 438, 23674...]
所以我尽力在Delphi / Pascal中复制它:
HSVtoRGB := [0, 0, 0];
(这是针对给定HSV值返回RGB数组的函数。)
但我收到错误:
[DCC Error] Unit2.pas(44): E2001 Ordinal type required
[DCC Error] Unit2.pas(45): E2010 Incompatible types: 'HSVRealArray' and 'Set'
有什么想法吗?这是学校的工作 - 但我的老师不知道答案。
答案 0 :(得分:19)
说到动态数组,是的:
type
TIntArray = array of integer;
procedure TForm1.Button1Click(Sender: TObject);
var
MyArr: TIntArray;
begin
MyArr := TIntArray.Create(10, 20, 30, 40);
end;
说到静态数组,你需要编写一个辅助函数:
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
记录。 (但记录和数组并不是一回事。)
答案 1 :(得分:9)
在这个领域,Delphi将大多数语言中简单的单行赋值语句转换为更复杂的东西。
一种方法是将值声明为类型常量:
type
HSVRealArray = array[1..3] of real;
const
constHSVVal: HSVRealArray = (0, 0, 0);
var
currentValue: HSVRealArray;
begin
currentValue := constHSVVal;
end;
另一种方法是创建返回所需类型的实用程序函数:
function MakeHSVRealArray(H, S, V: Real): HSVRealArray;
begin
Result[1] := H;
Result[2] := S;
Result[3] := V;
end;
currentValue := MakeHSVRealArray(0,0,0);
答案 2 :(得分:5)
通过一些额外的工作,您可以实现干净的实施:
var
x: TRGB;
begin
x := TRGB.Init(0,0,0);
end;
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;
答案 3 :(得分:4)
对于数组处理,数组初始化和数组常量声明,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;
以这种方式使用:
var MyArray: TRealStaticArray;
...
MyArray := RealArray([10.0, 20.0, 30.0]);
答案 4 :(得分:3)
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];
动态数组的运行时分配:
var
a : TArray<Integer>;
begin
a := [1,2,3];
不幸的是,这种语法不能用于普通的静态数组:
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;
答案 5 :(得分:1)
你可以尝试这样的事情:
TRGB = record
Red : integer;
Green: integer;
Bklue: integer;
end;
var Variable:TRGB;
Variable.Red:=0;
Variable.Green:=0;
Variable.Blue:=0;
答案 6 :(得分:1)
我知道这是一篇旧帖子,但我在研究Delphi的自动分配技术时遇到了这个问题。这篇文章有一个非常好的解释,以及一种自动分配记录数组的方法:
http://delphi.about.com/od/adptips2006/qt/const_array.htm
不幸的是,只能使用本机或记录类型进行初始化。类对象需要辅助函数,如上所示。
答案 7 :(得分:0)
[0, 0, 0]
是Delphi中的一个集合。 (0, 0, 0)
是Delphi中的数组常量!只需使用:
HSVtoRGB := (0, 0, 0);
(除非HSVtoRGB是一个动态数组。您是否将其声明为var HSVtoRGB: array[1..3] of integer;
或类似内容?
答案 8 :(得分:0)
抛开一般性问题,我想指出具体的用例无论如何都不会起作用:Delphi无法在堆栈上返回未知长度数组的内容。
调用代码需要知道函数的返回类型。它可能是指向堆的指针:它甚至可能是堆栈上的内存管理对象:但它不允许是堆栈上未定义的字节数,由目标函数动态决定。
在许多其他语言中,例子
return (0,0,0) //return pointer to automatic allocation
将是未定义的,即使编译器允许您这样做。
定义,使用和返回const值的常用方法是
int myarray[8] = {128, 38459, 438 ... 23674};
memcpy (myparam, myArray, sizeof (myArray));
......你可以在Delphi中做到这一点