Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 获取自定义数组类型的长度_Arrays_Delphi_Types_Dynamic Arrays - Fatal编程技术网

Arrays 获取自定义数组类型的长度

Arrays 获取自定义数组类型的长度,arrays,delphi,types,dynamic-arrays,Arrays,Delphi,Types,Dynamic Arrays,我想得到一个数组的长度,这个数组被声明为一个自定义类型,而这个自定义类型被声明为一个数组。我遵循这条路线来传递数组作为引用 这是我的密码: type TDLLPointerReference = Record Pointer : Pointer; IconName : Integer; DLLType : TDLLType; end; type TReffArray = array of TDLLPointerReferen

我想得到一个数组的长度,这个数组被声明为一个自定义类型,而这个自定义类型被声明为一个数组。我遵循这条路线来传递数组作为引用

这是我的密码:

type
    TDLLPointerReference = Record
        Pointer  : Pointer;
        IconName : Integer;
        DLLType  : TDLLType;
    end;

type
 TReffArray = array of TDLLPointerReference;

//compressor array's
    PARCompressors : TReffArray;
    PAROnCompressors : TReffArray;
    PARBaseCompressors : TReffArray;
    PARReserveCompressors : TReffArray;
    PARUnavailableCompressors : TReffArray;

function TCompressorPrioritiser.GetCompListLength(Aname : string250): integer;
var
i, k : integer;
begin
    i := ConvertStringtoIndex(AName);   //function to translate comp name to index
    case i of
        0 : k := length(PARCompressors);
        1 : k := length(PAROnCompressors);
        2 : k := length(PARBaseCompressors);
        3 : k := length(PARReserveCompressors);
        4 : k := length(PARUnavailableCompressors);
    else k := 0;
    end;
    result := k;//does not executes

    //test code begin Only added afterward
    PARUnavailableCompressors[1].Pointer := 0;  //executes
    k := length(PARUnavailableCompressors);     //executes
    i := k; //does not executes
    result := 5; //executes
    //test code ends
end;
此函数负责数组的自定义类型

procedure TCompressorPrioritiser.MoveComp(AIndex : integer; var ACompListOut : TReffArray;var ACompListIn : TReffArray);
var
i : integer;
begin
//This will move a compressor at the index in ACompListOut to  ACompListin
    setlength(ACompListIn, length(ACompListIn)+1);
    ACompListIn[length(ACompListIn)-1] :=  ACompListOut[AIndex];
    For i := Aindex to length(ACompListOut)-2 do
    begin
        ACompListOut[i] := ACompListOut[i+1];
    end;
    setlength(ACompListOut, length(ACompListOut)-1);
end;
是否有任何方法可以获得数组长度? 或者更改底部函数,以便我可以将数组的参数作为参数发送

主要的问题是,我标记为不编译的行,似乎没有运行。当我设置断点时,这些代码行被跳过,不能在那里设置断点。因为我要做的是得到数组的长度。假定函数返回它,但它跳过了返回函数。另外,如果在var k中添加一个表,delphi告诉我k对优化不可用,尽管它只是使用的一行。当我将手表添加到VARI时,也会发生同样的情况

我做了一些进一步的测试。现在,每行执行函数的第一个版本。第二个版本行result:=k不执行,为什么

第一版

function TCompressorPrioritiser.GetCompListLength(Aname : string250): integer;
var
i, k : integer;
begin
    i := ConvertStringtoIndex(AName);   //function to translate comp name to index
    case i of
        0 : k := length(PARCompressors);
        1 : k := length(PAROnCompressors);
        2 : k := length(PARBaseCompressors);
        3 : k := length(PARReserveCompressors);
        4 : k := length(PARUnavailableCompressors);
    else k := 0;
    end;
    result := k;//executes

    //test code begin
    k := length(PARUnavailableCompressors);     //executes
    //test code ends
end;
2版本

function TCompressorPrioritiser.GetCompListLength(Aname : string250): integer;
var
i, k : integer;
begin
    i := ConvertStringtoIndex(AName);   //function to translate comp name to index
    case i of
        0 : k := length(PARCompressors);
        1 : k := length(PAROnCompressors);
        2 : k := length(PARBaseCompressors);
        3 : k := length(PARReserveCompressors);
        4 : k := length(PARUnavailableCompressors);
    else k := 0;
    end;
    result := k;//does not executes

    //test code begin
    //k := length(PARUnavailableCompressors);     
    //test code ends
end;
编辑 将压缩机更改为阵列。这是压缩机的一个引用数组,没有正确键入抱歉

编辑2 在底部添加了问题陈述

编辑3 更改代码以反映建议的代码更改。并增加了进一步测试的第二部分

编辑4

我让代码工作,我得到了我想要的结果,但是我不知道为什么我需要这行:“k:=length(PARUnavailableCompressors);//executes”它没有任何用途,但是如果没有那行,“result:=k”行就不会执行。如果我将K:=length行替换为K:=6,那么结果:=K行也不会执行。那我为什么需要另一条线呢

function TCompressorPrioritiser.GetCompListLength(Aname : string250): integer;
var
i, k : integer;
begin
    k := 0;
    i := ConvertStringtoIndex(AName);   //function to translate comp name to index
    case i of
        0 : k := length(PARCompressors);
        1 : k := length(PAROnCompressors);
        2 : k := length(PARBaseCompressors);
        3 : k := length(PARReserveCompressors);
        4 : k := length(PARUnavailableCompressors);
    else k := 0;
    end;
    result := k;
    k := length(PARUnavailableCompressors);     //Withint this line code above line does not execute
    //k :=6;  // this does not have the same effect as the above line
end;

要获取类型数组的长度,请使用length方法:

但这已经是您在
MoveComp
中所做的事情,所以其他地方有问题。和
i:=k在i和k为整数时编译,无论发生什么情况,所以您的调试逻辑在我看来是错误的

编辑>>根据您更新的问题,您的问题是
结果:=k行似乎在执行过程中被跳过。我期望这种行为,因为您有一个
结果:=5行,因此编译器无需为
结果:=k。删除
//测试代码开始
//测试代码结束
之间的代码,然后查看现在发生了什么…

用于查找数组的长度

无法在标记的行上设置断点的原因是编译器已对它们进行了优化。编译器已确定它们没有影响

例如,您将一个值分配给
结果
,然后再将另一个值分配给
结果
,而无需在中间时间读取
结果
。因此,第一个赋值是无意义的,可以删除

i
的赋值是相同的。在赋值后执行的任何代码中,都不会引用局部变量
i
,因为赋值没有副作用,所以可以将其删除。编译器会警告您这一点。我希望您已启用警告并注意它们

禁用编译器选项中的优化将阻止编译器删除这些代码行


关于第二次更新,优化器再次让您感到困惑。编译器检测到变量
k
是多余的,并将其直接赋值给
Result
。您可以这样编写该函数:

function TCompressorPrioritiser.GetCompListLength(Aname : string250): integer;
begin
  case ConvertStringtoIndex(AName) of
  0 : Result := length(PARCompressors);
  1 : Result := length(PAROnCompressors);
  2 : Result := length(PARBaseCompressors);
  3 : Result := length(PARReserveCompressors);
  4 : Result := length(PARUnavailableCompressors);
  else Result := 0;
  end;
end;

我还必须指出,
ACompListOut
被错误地声明为
out
参数。由于是在函数内部读取的,因此必须将其声明为
var



我还建议您停止使用短字符串,转而使用
string

“不编译”是什么意思?错误文本是什么?来源在哪一行/哪一列?//“是否有任何方法可以获取压缩程序长度?”引用的函数/“中没有“压缩程序”或更改底部函数,以便我可以将数组作为参数发送”-当然,将“out”更改为“var”在您的示例中,
ACompListOut
被定义为
MoveComp()
方法的
out
参数,但是您可以在
ACompListIn[length(ACompListIn)-1]:=ACompListOut[AIndex]处从中读取数据虽然编译器允许这样做,但这是一种糟糕的编程实践。不清楚你在问什么。不仅仅是因为你声称的代码没有编译,事实上是这样的。需要一个SSCCE。我也许可以更清楚地了解非编译部分。它编译并运行。但是,当我添加断点时,它跳过了我标记为“不编译”的行。在过程中将out改为var,删除自定义类型并仅设置变量数组,在设置数组长度的行中仍然会出现不兼容的类型(“setlength(ACompListIn,length(ACompListIn)+1”))。我犯了这个错误,我不太确定OP想要什么。他在问题中写了大小而不是长度,inho是指从内存中占用的字节大小,即
length(myArray)*SizeOf(TTestRecord)
(在您的情况下)。请参阅我在文章中的编辑以及我对上述评论的评论。这是否让我更清楚什么是错的,我想要什么?不幸的是,一点也不清楚。您没有告诉我们您的代码出了什么问题……很抱歉,这次更好吗?我添加了结果:=5,在我第一次遇到问题之后,只是想看看它是否会在第一个结果之后实际运行代码,因为当时它直接运行到末尾,低于结果:=k;部分所以去掉它也没什么区别我把它改成了var,读我的
function TCompressorPrioritiser.GetCompListLength(Aname : string250): integer;
begin
  case ConvertStringtoIndex(AName) of
  0 : Result := length(PARCompressors);
  1 : Result := length(PAROnCompressors);
  2 : Result := length(PARBaseCompressors);
  3 : Result := length(PARReserveCompressors);
  4 : Result := length(PARUnavailableCompressors);
  else Result := 0;
  end;
end;