【问题标题】:Setlength in Delphi 10.2.3 for array like typesDelphi 10.2.3 中的 Setlength 用于类似数组的类型
【发布时间】: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)?" - 因为那样它就不是静态的了。
  • 或者不要学习指针,因为你不需要它们

标签: arrays delphi


【解决方案1】:

为了在 Delphi 中使用动态数组,你必须像这样声明一个数组:

TElement2=array of String; 

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

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

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

Element2x:=e;

除非两个变量都没有声明为同一类型,否则它不会编译:

e : TElement2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 2010-10-13
    相关资源
    最近更新 更多