Delphi 10.2.3中用于数组类型的Setlength

时间:2018-07-24 12:45:35

标签: arrays delphi

尽管我发现了一些与主题长度设置有关的帖子,但找不到解决问题的方法:

使用下面的代码-这是一个更大的程序的一部分-

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 loop-将属性分配给静态数组的每个位置(具有20个条目)或对应的动态数组,然后使用setlength。 但这没有用。是否可以将TElement2转换为数组? (因为它已经是数组!​​)

为什么不可能使用简单的静态字符串[a..20]字符串= a,为每个位置a [i] = TElement2 [i]设置并使用setlength(a,5)?

如果我使用DynArraySetLength(Pointer,typeInfo,dimCnt,lengthVec),这些变量必须使用什么? 我对指针几乎一无所知,对于这样的问题我也不知道,从给定的TElement2数组开始,要获取给定长度的数组必须使用哪些参数。顺便说一句,一般来说,使用动态数组是个好主意吗?

顺便说一句,该排序例程中可能还会出现错误,因为它无法正常工作...

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

要在Delphi中使用动态数组,必须声明一个这样的数组:

TElement2=array of String; 

而不是TElement2=array[20] of StringTElement2=array[1..20] of String;

如果您以这种方式声明TElement2,那么SetLength(element1X, 3);将起作用。

此外,当您在代码底部分配时

Element2x:=e;

除非两个变量的声明类型都不相同,否则不会编译:

e : TElement2;