【发布时间】:2018-07-24 12:45:35
【问题描述】:
虽然我发现了一些关于主题 setlength 的帖子,但我找不到解决问题的方法:
使用下面的代码 - 这是一个更大的程序的一部分 -
type TVektor2=array[20] of extended;
TElement2=array[20] of String;
Procedure Sort_Shell2(
element1X: TElement2; zahlX: TVektor2; var Element2X : TElement2;
var zahl2X : TVektor2);
var
bis, i, j, k, min : LongInt; l, laenge : single;
h,s,w,h1,h2, ElemX: string;
e : array[20] of String;
begin
laenge := 5; // just an example
SetLength(Element1X, 3); /// Error
//DynArraySetlength(e,l,1); /// how?
bis := High(e);
k := bis shr 1;// div 2
while (k > 0) do
begin
for i := 0 to (bis - k) do
begin
j := i;
h1 := e[j]; //I use this because before I had an Acces violation
h2 := e[j + k]; // using directly e[j] := e[j+k];
while (j >= 0) and (h1 > h2) do
begin
h := h1;
l:=zahlx[j]; //str(l:5:3,S);showmessage(h + s);
e[j] :=e[j + k];
zahlx[j] := zahlx[j+ k];
e[j + k] := h;
zahlx[j+ k]:=l;
if j > k then
Dec(j, k)
else
j := 0;
end; // {end while]
end; // { end for}
k := k shr 1; // div 2
end; // {end while}
Element2x:=e; zahl2x :=zahlx;
end;
如果我尝试这样的 setlength 命令,我会收到错误“不兼容的类型”。 我尝试了 - 使用 for next 循环 - 将属性分配给静态数组的每个位置(有 20 个条目)或相应的动态数组,然后使用 setlength。 但它没有用。是否可以将 TElement2 转换为数组? (因为它已经是一个数组了!)
为什么不能使用strings = a的简单静态数组[1..20],为每个位置设置a[i] = TElement2[i]并使用setlength(a,5)?
如果我使用 DynArraySetLength(Pointer, typeInfo,dimCnt, lengthVec) 我必须为这些变量使用什么? 我对指针几乎一无所知,对于这样的问题,我不知道必须使用哪些参数来获取从给定 TElement2 数组开始的给定长度的数组。顺便问一下,一般来说,使用动态数组是个好主意吗?
顺便说一句,这个排序例程也可能有错误,因为它不能很好地工作......
谁能帮帮我?
【问题讨论】:
-
您已将基本类型声明为只有 20 个元素的静态数组 (
TElement2=array[20] of String;)。这意味着它的大小固定为 20 个元素,并且您无法在运行时更改它。动态数组可以使用 SetLength 调整大小,但不能使用静态数组。见documentation -
这不是你的真实代码。此处的代码此时失败
TVektor2 = array [20] of extended,错误为:E2029 '..' expected but ']' found。你的真实密码是什么?除此之外,SetLength用于动态数组。您是否阅读过动态数组的文档?如果没有,为什么不呢? -
@KenWhite 不,不是那个意思。该声明是一个语法错误。
-
- "为什么不能使用简单的静态数组[1..20] ... ...并使用setlength(a,5)?" - 因为那样它就不是静态的了。
-
或者不要学习指针,因为你不需要它们