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;