Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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
记录数组中的默认布尔值-Delphi_Delphi_Arrays_Boolean_Delphi 7 - Fatal编程技术网

记录数组中的默认布尔值-Delphi

记录数组中的默认布尔值-Delphi,delphi,arrays,boolean,delphi-7,Delphi,Arrays,Boolean,Delphi 7,我正在用一些旧的Delphi7代码帮助我的公司 在开始时声明了一条记录,该记录用于存储我们想要输出的所有数据 类型 TOutput_类型=记录 结果:字符串; resultofset:字符串; 所选:布尔型; 结果类别:整数; 结束 然后声明一个数组 输出:TOutput_类型的数组 由于实际长度未知,因此在开始时将长度设置为较大的值。 这个数组到处都在使用,但不幸的是,使用时并不总是设置所选的值。 我的问题是我正在添加一个数据摘要,但由于未设置selected,delphi似乎给它一个随机的t

我正在用一些旧的Delphi7代码帮助我的公司

在开始时声明了一条记录,该记录用于存储我们想要输出的所有数据

类型 TOutput_类型=记录 结果:字符串; resultofset:字符串; 所选:布尔型; 结果类别:整数; 结束

然后声明一个数组

输出:TOutput_类型的数组

由于实际长度未知,因此在开始时将长度设置为较大的值。 这个数组到处都在使用,但不幸的是,使用时并不总是设置所选的值。 我的问题是我正在添加一个数据摘要,但由于未设置selected,delphi似乎给它一个随机的true或false状态。 是否有一种方法可以在开始时将选定的所有实例设置为true?这似乎是一件很简单的事情,但我不是一个delphi程序员,所以我不确定这是否可能?我知道我可以在每次制作新记录时进行检查并添加选定项:=true,但如果可能的话,我希望一开始就做得干净利落。。。。
提前感谢

我会选择dcp链接问题中的工厂方法。记录不允许使用无参数构造函数,因此您必须始终指定一些参数,如果您真的不需要这些参数,这可能会很烦人

如果这一切都是关于在开始时初始化大型数组的内容一次,那么您也可以使用以下方法:

SetLength(Output, MyArbitraryItemCount);
FillChar(Output[0], Length(Output)*SizeOf(TOutput_Type), 1);

那么一切都是1。包括所选:当然,您也可以使用for循环…

我会选择工厂方法,如dcp链接到的问题中所示。记录不允许使用无参数构造函数,因此您必须始终指定一些参数,如果您真的不需要这些参数,这可能会很烦人

如果这一切都是关于在开始时初始化大型数组的内容一次,那么您也可以使用以下方法:

SetLength(Output, MyArbitraryItemCount);
FillChar(Output[0], Length(Output)*SizeOf(TOutput_Type), 1);

那么一切都是1。包括所选:当然,您也可以使用for循环…

在调用SetLengt for Output变量后,必须首先启动新的记录部分,因为for循环中没有定义新分配的内存。 比如:

OldLength := Length(Output);
SetLength(Output, NewLength);
for n := OldLength to NewLength -1 do 
  Output[n].selected := True;

在为输出变量调用SetLengt之后,必须首先启动新的记录部分,因为for循环中没有定义新分配的内存。 比如:

OldLength := Length(Output);
SetLength(Output, NewLength);
for n := OldLength to NewLength -1 do 
  Output[n].selected := True;

与对象不同,记录在创建时不会初始化,因此您需要自己初始化它们。因为您使用的是Delphi 7,所以不能将记录与方法一起使用,所以我要做的是创建一个初始化函数,类似这样:

type
  TOutputArray: array of TOutput_Type; 

function CreateOutputArray(length: integer): TOutputArray;
var
  i: integer;
begin
  SetLength(result, MyArbitraryItemCount);
  FillChar(result[0], Length(Output)*SizeOf(TOutput_Type), 0);
  for i := 0 to high(result) do
    result[i].selected := true;
end;

与对象不同,记录在创建时不会初始化,因此您需要自己初始化它们。因为您使用的是Delphi 7,所以不能将记录与方法一起使用,所以我要做的是创建一个初始化函数,类似这样:

type
  TOutputArray: array of TOutput_Type; 

function CreateOutputArray(length: integer): TOutputArray;
var
  i: integer;
begin
  SetLength(result, MyArbitraryItemCount);
  FillChar(result[0], Length(Output)*SizeOf(TOutput_Type), 0);
  for i := 0 to high(result) do
    result[i].selected := true;
end;

这并不完全正确。SetLength零初始化它分配的内存,这使得布尔值默认为false;我试过了,花了很长时间。问题是数组设置为长度为0以清除数组,然后长度约为57000:处理需要几分钟…@VilleK:来自Delphi帮助:对于长字符串或动态数组变量,SetLength将S引用的字符串或数组重新分配到给定长度。字符串中的现有字符或数组中的元素被保留,但新分配的空间的内容未定义。@GJ:同样来自Delphi帮助:当增加动态数组的长度时,其中元素是必须初始化的类型字符串、变量、变量数组,或包含此类类型的记录。当S是必须初始化的类型的动态数组时,新分配的空间设置为0或nil@GJ,@Gerry:TOutput_类型的数组是一个动态数组。TOutput_类型属于包含此类类型类别的记录,因此将归零。如果您检查System.pas中的例程DynArraySetLength,这是调用SetLength时使用的例程,您将看到它总是使用FillChar调用清除分配的内存,至少在Delphi 2010中是这样。但是我同意使用循环来初始化是一个好主意,特别是在这种情况下,当期望值为真非零时,这是不完全正确的。SetLength零初始化它分配的内存,这使得布尔值默认为false;我试过了,花了很长时间。问题是数组设置为长度为0以清除数组,然后长度约为57000:处理需要几分钟…@VilleK:来自Delphi帮助:对于长字符串或动态数组变量,SetLength将S引用的字符串或数组重新分配到给定长度。字符串中的现有字符或数组中的元素将被保留,但新分配空间的内容未定义。@GJ:同样来自Delphi帮助:当增加动态数组的长度时,一个例外是
n其中元素是必须初始化的类型字符串、变量、变量数组或包含此类类型的记录。当S是必须初始化的类型的动态数组时,新分配的空间设置为0或nil@GJ,@Gerry:TOutput_类型的数组是一个动态数组。TOutput_类型属于包含此类类型类别的记录,因此将归零。如果您检查System.pas中的例程DynArraySetLength,这是调用SetLength时使用的例程,您将看到它总是使用FillChar调用清除分配的内存,至少在Delphi 2010中是这样。但我同意使用循环来初始化是一个好主意,尤其是在这种情况下,当所需的值为True非零时;指向指针$01010101不是一个好主意;指向指针$01010101并不是一个好主意。示例中有一个小问题-您使用长度作为参数,然后尝试使用长度函数。我想你是想调用参数MyArbitraryItemCount@Gerry:是的,类似的。示例有一个小问题-您使用长度作为参数,然后尝试使用长度函数。我想你是想调用参数MyArbitraryItemCount@Gerry:是的,差不多。