Error[8]: Undefined offset: 4, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录, 附加的程序产生以下输出: ci iA r1 r2 r31 1 1 1 496947644911157522 2 2 2 115705203 3 3 3 04 4 4 4 05 5 5 5 0 > TRec是包含要初始 我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录,

附加的程序产生以下输出:

ci iA r1 r2 r31  1  1  1  496947644911157522  2  2  2  115705203  3  3  3  04  4  4  4  05  5  5  5  0

> TRec是包含要初始化的动态数组的记录类型。
> ci是整数的常数数组。
ia是整数的动态数组。
> r1,r2,r3是以不同方式初始化的TREC类型的记录。

从输出可以看出,前两个赋值(r1,r2),使用常数按预期工作。第三个赋值r3:= iArray被编译器接受,但结果被破坏。调试器显示在TRec.Implicit中v的值已经错误了。

这里出了什么问题?这是可能的吗

program Project5;{$APPTYPE CONSolE}{$R *.res}type  TRec = record    iArray: array of UInt64;    class operator Implicit(const v: array of UInt64): TRec;  end;{ TRec }class operator TRec.Implicit(const v: array of UInt64): TRec;var  i: integer;begin  setlength(Result.iArray,Length(v));  for i := 0 to High(v) do    Result.iArray[i] := v[i];end;const  ciArray: array [0 .. 4] of UInt64 = (1,2,3,4,5);var  i         : integer;  iArray    : array of UInt64;  r1,r2,r3: TRec;begin  iArray := [1,5];  r1 := [1,5];  r2 := ciArray;  r3 := iArray;  Writeln('ci iA r1 r1 r3');  for I := 0 to High(ciArray) do    Writeln(ciArray[i],'  ',iArray[i],r1.iArray[i],r2.iArray[i],r3.iArray[i]);  readln;end.
解决方法 看起来你发现了一个BUG代码在那里(它也存在于Win64编译器)。我查看了生成的asm,似乎编译器会为运算符重载产生错误的指令。这就是为什么错误的值最终在 *** 作符重载的数组中。请在质量门户中报告。

生成错误结果的代码:

Project109.dpr.46: r3 := iArray;0040B1F2 A1FC044100       mov eax,[
Project109.dpr.47: r3 := TRec.Implicit(iArray);0040B22F A1FC044100       mov eax,[[+++]4104fc]0040B234 8945E4           mov [ebp-c],eax0040B237 837DE400         cmp DWord ptr [ebp-c],[+++]0040B23B 740B             jz [+++]40b2480040B23D 8B45E4           mov eax,[ebp-c]0040B240 83E804           sub eax,0040B243 8B00             mov eax,[eax]0040B245 8945E4           mov [ebp-c],eax0040B248 8D4DD4           lea ecx,[ebp-c]0040B24B 8B55E4           mov edx,[ebp-c]0040B24E 4A               dec edx0040B24F A1FC044100       mov eax,[[+++]4104fc] // <-- correct one0040B254 E8CFF5FFFF       call TRec.Implicit
4104fc]0040B1F7 8945E8 mov [ebp-],eax0040B1FA 837DE800 cmp DWord ptr [ebp-],[+++]0040B1FE 740B jz [+++]40b20b0040B200 8B45E8 mov eax,[ebp-]0040B203 83E804 sub eax,0040B206 8B00 mov eax,[eax]0040B208 8945E8 mov [ebp-],eax0040B20B 8D4DD8 lea ecx,[ebp-]0040B20E 8B55E8 mov edx,[ebp-]0040B211 4A dec edx0040B212 B8FC044100 mov eax,[+++]4104fc // <-- wrong one0040B217 E87CF5FFFF call TRec.&op_Implicit

相同方法的代码:

[+++]

但是,您可以通过为参数类型为TArray< UInt64>的Implicit *** 作符添加另一个重载来避免这种情况。然后还声明您的本地变量为该类型,以便编译器选择正确的重载(在这种情况下它不会生成错误的代码)。

但请注意,这将仅在您传递类型为TArray< UInt64>并且由于Delphis严格类型规则,当您有任何其他UInt64的动态数组时,调用错误的一个。

总结

以上是内存溢出为你收集整理的数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record全部内容,希望文章能够帮你解决数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 5, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录, 附加的程序产生以下输出: ci iA r1 r2 r31 1 1 1 496947644911157522 2 2 2 115705203 3 3 3 04 4 4 4 05 5 5 5 0 > TRec是包含要初始 我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录,

附加的程序产生以下输出:

ci iA r1 r2 r31  1  1  1  496947644911157522  2  2  2  115705203  3  3  3  04  4  4  4  05  5  5  5  0

> TRec是包含要初始化的动态数组的记录类型。
> ci是整数的常数数组。
ia是整数的动态数组。
> r1,r2,r3是以不同方式初始化的TREC类型的记录。

从输出可以看出,前两个赋值(r1,r2),使用常数按预期工作。第三个赋值r3:= iArray被编译器接受,但结果被破坏。调试器显示在TRec.Implicit中v的值已经错误了。

这里出了什么问题?这是可能的吗

program Project5;{$APPTYPE CONSolE}{$R *.res}type  TRec = record    iArray: array of UInt64;    class operator Implicit(const v: array of UInt64): TRec;  end;{ TRec }class operator TRec.Implicit(const v: array of UInt64): TRec;var  i: integer;begin  setlength(Result.iArray,Length(v));  for i := 0 to High(v) do    Result.iArray[i] := v[i];end;const  ciArray: array [0 .. 4] of UInt64 = (1,2,3,4,5);var  i         : integer;  iArray    : array of UInt64;  r1,r2,r3: TRec;begin  iArray := [1,5];  r1 := [1,5];  r2 := ciArray;  r3 := iArray;  Writeln('ci iA r1 r1 r3');  for I := 0 to High(ciArray) do    Writeln(ciArray[i],'  ',iArray[i],r1.iArray[i],r2.iArray[i],r3.iArray[i]);  readln;end.
解决方法 看起来你发现了一个BUG代码在那里(它也存在于Win64编译器)。我查看了生成的asm,似乎编译器会为运算符重载产生错误的指令。这就是为什么错误的值最终在 *** 作符重载的数组中。请在质量门户中报告。

生成错误结果的代码:

Project109.dpr.46: r3 := iArray;0040B1F2 A1FC044100       mov eax,[
Project109.dpr.47: r3 := TRec.Implicit(iArray);0040B22F A1FC044100       mov eax,[4104fc]0040B234 8945E4           mov [ebp-c],eax0040B237 837DE400         cmp DWord ptr [ebp-c],[+++]0040B23B 740B             jz [+++]40b2480040B23D 8B45E4           mov eax,[ebp-c]0040B240 83E804           sub eax,0040B243 8B00             mov eax,[eax]0040B245 8945E4           mov [ebp-c],eax0040B248 8D4DD4           lea ecx,[ebp-c]0040B24B 8B55E4           mov edx,[ebp-c]0040B24E 4A               dec edx0040B24F A1FC044100       mov eax,[[+++]4104fc] // <-- correct one0040B254 E8CFF5FFFF       call TRec.Implicit
4104fc]0040B1F7 8945E8 mov [ebp-],eax0040B1FA 837DE800 cmp DWord ptr [ebp-],[+++]0040B1FE 740B jz [+++]40b20b0040B200 8B45E8 mov eax,[ebp-]0040B203 83E804 sub eax,0040B206 8B00 mov eax,[eax]0040B208 8945E8 mov [ebp-],eax0040B20B 8D4DD8 lea ecx,[ebp-]0040B20E 8B55E8 mov edx,[ebp-]0040B211 4A dec edx0040B212 B8FC044100 mov eax,[+++]4104fc // <-- wrong one0040B217 E87CF5FFFF call TRec.&op_Implicit

相同方法的代码:

[+++]

但是,您可以通过为参数类型为TArray< UInt64>的Implicit *** 作符添加另一个重载来避免这种情况。然后还声明您的本地变量为该类型,以便编译器选择正确的重载(在这种情况下它不会生成错误的代码)。

但请注意,这将仅在您传递类型为TArray< UInt64>并且由于Delphis严格类型规则,当您有任何其他UInt64的动态数组时,调用错误的一个。

总结

以上是内存溢出为你收集整理的数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record全部内容,希望文章能够帮你解决数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 6, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录, 附加的程序产生以下输出: ci iA r1 r2 r31 1 1 1 496947644911157522 2 2 2 115705203 3 3 3 04 4 4 4 05 5 5 5 0 > TRec是包含要初始 我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录,

附加的程序产生以下输出:

ci iA r1 r2 r31  1  1  1  496947644911157522  2  2  2  115705203  3  3  3  04  4  4  4  05  5  5  5  0

> TRec是包含要初始化的动态数组的记录类型。
> ci是整数的常数数组。
ia是整数的动态数组。
> r1,r2,r3是以不同方式初始化的TREC类型的记录。

从输出可以看出,前两个赋值(r1,r2),使用常数按预期工作。第三个赋值r3:= iArray被编译器接受,但结果被破坏。调试器显示在TRec.Implicit中v的值已经错误了。

这里出了什么问题?这是可能的吗

program Project5;{$APPTYPE CONSolE}{$R *.res}type  TRec = record    iArray: array of UInt64;    class operator Implicit(const v: array of UInt64): TRec;  end;{ TRec }class operator TRec.Implicit(const v: array of UInt64): TRec;var  i: integer;begin  setlength(Result.iArray,Length(v));  for i := 0 to High(v) do    Result.iArray[i] := v[i];end;const  ciArray: array [0 .. 4] of UInt64 = (1,2,3,4,5);var  i         : integer;  iArray    : array of UInt64;  r1,r2,r3: TRec;begin  iArray := [1,5];  r1 := [1,5];  r2 := ciArray;  r3 := iArray;  Writeln('ci iA r1 r1 r3');  for I := 0 to High(ciArray) do    Writeln(ciArray[i],'  ',iArray[i],r1.iArray[i],r2.iArray[i],r3.iArray[i]);  readln;end.
解决方法 看起来你发现了一个BUG代码在那里(它也存在于Win64编译器)。我查看了生成的asm,似乎编译器会为运算符重载产生错误的指令。这就是为什么错误的值最终在 *** 作符重载的数组中。请在质量门户中报告。

生成错误结果的代码:

Project109.dpr.46: r3 := iArray;0040B1F2 A1FC044100       mov eax,[
Project109.dpr.47: r3 := TRec.Implicit(iArray);0040B22F A1FC044100       mov eax,[4104fc]0040B234 8945E4           mov [ebp-c],eax0040B237 837DE400         cmp DWord ptr [ebp-c],0040B23B 740B             jz [+++]40b2480040B23D 8B45E4           mov eax,[ebp-c]0040B240 83E804           sub eax,0040B243 8B00             mov eax,[eax]0040B245 8945E4           mov [ebp-c],eax0040B248 8D4DD4           lea ecx,[ebp-c]0040B24B 8B55E4           mov edx,[ebp-c]0040B24E 4A               dec edx0040B24F A1FC044100       mov eax,[[+++]4104fc] // <-- correct one0040B254 E8CFF5FFFF       call TRec.Implicit
4104fc]0040B1F7 8945E8 mov [ebp-],eax0040B1FA 837DE800 cmp DWord ptr [ebp-],[+++]0040B1FE 740B jz [+++]40b20b0040B200 8B45E8 mov eax,[ebp-]0040B203 83E804 sub eax,0040B206 8B00 mov eax,[eax]0040B208 8945E8 mov [ebp-],eax0040B20B 8D4DD8 lea ecx,[ebp-]0040B20E 8B55E8 mov edx,[ebp-]0040B211 4A dec edx0040B212 B8FC044100 mov eax,[+++]4104fc // <-- wrong one0040B217 E87CF5FFFF call TRec.&op_Implicit

相同方法的代码:

[+++]

但是,您可以通过为参数类型为TArray< UInt64>的Implicit *** 作符添加另一个重载来避免这种情况。然后还声明您的本地变量为该类型,以便编译器选择正确的重载(在这种情况下它不会生成错误的代码)。

但请注意,这将仅在您传递类型为TArray< UInt64>并且由于Delphis严格类型规则,当您有任何其他UInt64的动态数组时,调用错误的一个。

总结

以上是内存溢出为你收集整理的数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record全部内容,希望文章能够帮你解决数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 7, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录, 附加的程序产生以下输出: ci iA r1 r2 r31 1 1 1 496947644911157522 2 2 2 115705203 3 3 3 04 4 4 4 05 5 5 5 0 > TRec是包含要初始 我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录,

附加的程序产生以下输出:

ci iA r1 r2 r31  1  1  1  496947644911157522  2  2  2  115705203  3  3  3  04  4  4  4  05  5  5  5  0

> TRec是包含要初始化的动态数组的记录类型。
> ci是整数的常数数组。
ia是整数的动态数组。
> r1,r2,r3是以不同方式初始化的TREC类型的记录。

从输出可以看出,前两个赋值(r1,r2),使用常数按预期工作。第三个赋值r3:= iArray被编译器接受,但结果被破坏。调试器显示在TRec.Implicit中v的值已经错误了。

这里出了什么问题?这是可能的吗

program Project5;{$APPTYPE CONSolE}{$R *.res}type  TRec = record    iArray: array of UInt64;    class operator Implicit(const v: array of UInt64): TRec;  end;{ TRec }class operator TRec.Implicit(const v: array of UInt64): TRec;var  i: integer;begin  setlength(Result.iArray,Length(v));  for i := 0 to High(v) do    Result.iArray[i] := v[i];end;const  ciArray: array [0 .. 4] of UInt64 = (1,2,3,4,5);var  i         : integer;  iArray    : array of UInt64;  r1,r2,r3: TRec;begin  iArray := [1,5];  r1 := [1,5];  r2 := ciArray;  r3 := iArray;  Writeln('ci iA r1 r1 r3');  for I := 0 to High(ciArray) do    Writeln(ciArray[i],'  ',iArray[i],r1.iArray[i],r2.iArray[i],r3.iArray[i]);  readln;end.
解决方法 看起来你发现了一个BUG代码在那里(它也存在于Win64编译器)。我查看了生成的asm,似乎编译器会为运算符重载产生错误的指令。这就是为什么错误的值最终在 *** 作符重载的数组中。请在质量门户中报告。

生成错误结果的代码:

Project109.dpr.46: r3 := iArray;0040B1F2 A1FC044100       mov eax,[
Project109.dpr.47: r3 := TRec.Implicit(iArray);0040B22F A1FC044100       mov eax,[4104fc]0040B234 8945E4           mov [ebp-c],eax0040B237 837DE400         cmp DWord ptr [ebp-c],0040B23B 740B             jz 40b2480040B23D 8B45E4           mov eax,[ebp-c]0040B240 83E804           sub eax,0040B243 8B00             mov eax,[eax]0040B245 8945E4           mov [ebp-c],eax0040B248 8D4DD4           lea ecx,[ebp-c]0040B24B 8B55E4           mov edx,[ebp-c]0040B24E 4A               dec edx0040B24F A1FC044100       mov eax,[[+++]4104fc] // <-- correct one0040B254 E8CFF5FFFF       call TRec.Implicit
4104fc]0040B1F7 8945E8 mov [ebp-],eax0040B1FA 837DE800 cmp DWord ptr [ebp-],[+++]0040B1FE 740B jz [+++]40b20b0040B200 8B45E8 mov eax,[ebp-]0040B203 83E804 sub eax,0040B206 8B00 mov eax,[eax]0040B208 8945E8 mov [ebp-],eax0040B20B 8D4DD8 lea ecx,[ebp-]0040B20E 8B55E8 mov edx,[ebp-]0040B211 4A dec edx0040B212 B8FC044100 mov eax,[+++]4104fc // <-- wrong one0040B217 E87CF5FFFF call TRec.&op_Implicit

相同方法的代码:

[+++]

但是,您可以通过为参数类型为TArray< UInt64>的Implicit *** 作符添加另一个重载来避免这种情况。然后还声明您的本地变量为该类型,以便编译器选择正确的重载(在这种情况下它不会生成错误的代码)。

但请注意,这将仅在您传递类型为TArray< UInt64>并且由于Delphis严格类型规则,当您有任何其他UInt64的动态数组时,调用错误的一个。

总结

以上是内存溢出为你收集整理的数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record全部内容,希望文章能够帮你解决数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 8, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录, 附加的程序产生以下输出: ci iA r1 r2 r31 1 1 1 496947644911157522 2 2 2 115705203 3 3 3 04 4 4 4 05 5 5 5 0 > TRec是包含要初始 我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录,

附加的程序产生以下输出:

ci iA r1 r2 r31  1  1  1  496947644911157522  2  2  2  115705203  3  3  3  04  4  4  4  05  5  5  5  0

> TRec是包含要初始化的动态数组的记录类型。
> ci是整数的常数数组。
ia是整数的动态数组。
> r1,r2,r3是以不同方式初始化的TREC类型的记录。

从输出可以看出,前两个赋值(r1,r2),使用常数按预期工作。第三个赋值r3:= iArray被编译器接受,但结果被破坏。调试器显示在TRec.Implicit中v的值已经错误了。

这里出了什么问题?这是可能的吗

program Project5;{$APPTYPE CONSolE}{$R *.res}type  TRec = record    iArray: array of UInt64;    class operator Implicit(const v: array of UInt64): TRec;  end;{ TRec }class operator TRec.Implicit(const v: array of UInt64): TRec;var  i: integer;begin  setlength(Result.iArray,Length(v));  for i := 0 to High(v) do    Result.iArray[i] := v[i];end;const  ciArray: array [0 .. 4] of UInt64 = (1,2,3,4,5);var  i         : integer;  iArray    : array of UInt64;  r1,r2,r3: TRec;begin  iArray := [1,5];  r1 := [1,5];  r2 := ciArray;  r3 := iArray;  Writeln('ci iA r1 r1 r3');  for I := 0 to High(ciArray) do    Writeln(ciArray[i],'  ',iArray[i],r1.iArray[i],r2.iArray[i],r3.iArray[i]);  readln;end.
解决方法 看起来你发现了一个BUG代码在那里(它也存在于Win64编译器)。我查看了生成的asm,似乎编译器会为运算符重载产生错误的指令。这就是为什么错误的值最终在 *** 作符重载的数组中。请在质量门户中报告。

生成错误结果的代码:

Project109.dpr.46: r3 := iArray;0040B1F2 A1FC044100       mov eax,[
Project109.dpr.47: r3 := TRec.Implicit(iArray);0040B22F A1FC044100       mov eax,[4104fc]0040B234 8945E4           mov [ebp-c],eax0040B237 837DE400         cmp DWord ptr [ebp-c],0040B23B 740B             jz 40b2480040B23D 8B45E4           mov eax,[ebp-c]0040B240 83E804           sub eax,0040B243 8B00             mov eax,[eax]0040B245 8945E4           mov [ebp-c],eax0040B248 8D4DD4           lea ecx,[ebp-c]0040B24B 8B55E4           mov edx,[ebp-c]0040B24E 4A               dec edx0040B24F A1FC044100       mov eax,[4104fc] // <-- correct one0040B254 E8CFF5FFFF       call TRec.Implicit
4104fc]0040B1F7 8945E8 mov [ebp-],eax0040B1FA 837DE800 cmp DWord ptr [ebp-],[+++]0040B1FE 740B jz [+++]40b20b0040B200 8B45E8 mov eax,[ebp-]0040B203 83E804 sub eax,0040B206 8B00 mov eax,[eax]0040B208 8945E8 mov [ebp-],eax0040B20B 8D4DD8 lea ecx,[ebp-]0040B20E 8B55E8 mov edx,[ebp-]0040B211 4A dec edx0040B212 B8FC044100 mov eax,[+++]4104fc // <-- wrong one0040B217 E87CF5FFFF call TRec.&op_Implicit

相同方法的代码:

[+++]

但是,您可以通过为参数类型为TArray< UInt64>的Implicit *** 作符添加另一个重载来避免这种情况。然后还声明您的本地变量为该类型,以便编译器选择正确的重载(在这种情况下它不会生成错误的代码)。

但请注意,这将仅在您传递类型为TArray< UInt64>并且由于Delphis严格类型规则,当您有任何其他UInt64的动态数组时,调用错误的一个。

总结

以上是内存溢出为你收集整理的数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record全部内容,希望文章能够帮你解决数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 9, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录, 附加的程序产生以下输出: ci iA r1 r2 r31 1 1 1 496947644911157522 2 2 2 115705203 3 3 3 04 4 4 4 05 5 5 5 0 > TRec是包含要初始 我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录,

附加的程序产生以下输出:

ci iA r1 r2 r31  1  1  1  496947644911157522  2  2  2  115705203  3  3  3  04  4  4  4  05  5  5  5  0

> TRec是包含要初始化的动态数组的记录类型。
> ci是整数的常数数组。
ia是整数的动态数组。
> r1,r2,r3是以不同方式初始化的TREC类型的记录。

从输出可以看出,前两个赋值(r1,r2),使用常数按预期工作。第三个赋值r3:= iArray被编译器接受,但结果被破坏。调试器显示在TRec.Implicit中v的值已经错误了。

这里出了什么问题?这是可能的吗

program Project5;{$APPTYPE CONSolE}{$R *.res}type  TRec = record    iArray: array of UInt64;    class operator Implicit(const v: array of UInt64): TRec;  end;{ TRec }class operator TRec.Implicit(const v: array of UInt64): TRec;var  i: integer;begin  setlength(Result.iArray,Length(v));  for i := 0 to High(v) do    Result.iArray[i] := v[i];end;const  ciArray: array [0 .. 4] of UInt64 = (1,2,3,4,5);var  i         : integer;  iArray    : array of UInt64;  r1,r2,r3: TRec;begin  iArray := [1,5];  r1 := [1,5];  r2 := ciArray;  r3 := iArray;  Writeln('ci iA r1 r1 r3');  for I := 0 to High(ciArray) do    Writeln(ciArray[i],'  ',iArray[i],r1.iArray[i],r2.iArray[i],r3.iArray[i]);  readln;end.
解决方法 看起来你发现了一个BUG代码在那里(它也存在于Win64编译器)。我查看了生成的asm,似乎编译器会为运算符重载产生错误的指令。这就是为什么错误的值最终在 *** 作符重载的数组中。请在质量门户中报告。

生成错误结果的代码:

Project109.dpr.46: r3 := iArray;0040B1F2 A1FC044100       mov eax,[
Project109.dpr.47: r3 := TRec.Implicit(iArray);0040B22F A1FC044100       mov eax,[4104fc]0040B234 8945E4           mov [ebp-c],eax0040B237 837DE400         cmp DWord ptr [ebp-c],0040B23B 740B             jz 40b2480040B23D 8B45E4           mov eax,[ebp-c]0040B240 83E804           sub eax,0040B243 8B00             mov eax,[eax]0040B245 8945E4           mov [ebp-c],eax0040B248 8D4DD4           lea ecx,[ebp-c]0040B24B 8B55E4           mov edx,[ebp-c]0040B24E 4A               dec edx0040B24F A1FC044100       mov eax,[4104fc] // <-- correct one0040B254 E8CFF5FFFF       call TRec.Implicit
4104fc]0040B1F7 8945E8 mov [ebp-],eax0040B1FA 837DE800 cmp DWord ptr [ebp-],0040B1FE 740B jz [+++]40b20b0040B200 8B45E8 mov eax,[ebp-]0040B203 83E804 sub eax,0040B206 8B00 mov eax,[eax]0040B208 8945E8 mov [ebp-],eax0040B20B 8D4DD8 lea ecx,[ebp-]0040B20E 8B55E8 mov edx,[ebp-]0040B211 4A dec edx0040B212 B8FC044100 mov eax,[+++]4104fc // <-- wrong one0040B217 E87CF5FFFF call TRec.&op_Implicit

相同方法的代码:

[+++]

但是,您可以通过为参数类型为TArray< UInt64>的Implicit *** 作符添加另一个重载来避免这种情况。然后还声明您的本地变量为该类型,以便编译器选择正确的重载(在这种情况下它不会生成错误的代码)。

但请注意,这将仅在您传递类型为TArray< UInt64>并且由于Delphis严格类型规则,当您有任何其他UInt64的动态数组时,调用错误的一个。

总结

以上是内存溢出为你收集整理的数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record全部内容,希望文章能够帮你解决数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 10, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录, 附加的程序产生以下输出: ci iA r1 r2 r31 1 1 1 496947644911157522 2 2 2 115705203 3 3 3 04 4 4 4 05 5 5 5 0 > TRec是包含要初始 我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录,

附加的程序产生以下输出:

ci iA r1 r2 r31  1  1  1  496947644911157522  2  2  2  115705203  3  3  3  04  4  4  4  05  5  5  5  0

> TRec是包含要初始化的动态数组的记录类型。
> ci是整数的常数数组。
ia是整数的动态数组。
> r1,r2,r3是以不同方式初始化的TREC类型的记录。

从输出可以看出,前两个赋值(r1,r2),使用常数按预期工作。第三个赋值r3:= iArray被编译器接受,但结果被破坏。调试器显示在TRec.Implicit中v的值已经错误了。

这里出了什么问题?这是可能的吗

program Project5;{$APPTYPE CONSolE}{$R *.res}type  TRec = record    iArray: array of UInt64;    class operator Implicit(const v: array of UInt64): TRec;  end;{ TRec }class operator TRec.Implicit(const v: array of UInt64): TRec;var  i: integer;begin  setlength(Result.iArray,Length(v));  for i := 0 to High(v) do    Result.iArray[i] := v[i];end;const  ciArray: array [0 .. 4] of UInt64 = (1,2,3,4,5);var  i         : integer;  iArray    : array of UInt64;  r1,r2,r3: TRec;begin  iArray := [1,5];  r1 := [1,5];  r2 := ciArray;  r3 := iArray;  Writeln('ci iA r1 r1 r3');  for I := 0 to High(ciArray) do    Writeln(ciArray[i],'  ',iArray[i],r1.iArray[i],r2.iArray[i],r3.iArray[i]);  readln;end.
解决方法 看起来你发现了一个BUG代码在那里(它也存在于Win64编译器)。我查看了生成的asm,似乎编译器会为运算符重载产生错误的指令。这就是为什么错误的值最终在 *** 作符重载的数组中。请在质量门户中报告。

生成错误结果的代码:

Project109.dpr.46: r3 := iArray;0040B1F2 A1FC044100       mov eax,[
Project109.dpr.47: r3 := TRec.Implicit(iArray);0040B22F A1FC044100       mov eax,[4104fc]0040B234 8945E4           mov [ebp-c],eax0040B237 837DE400         cmp DWord ptr [ebp-c],0040B23B 740B             jz 40b2480040B23D 8B45E4           mov eax,[ebp-c]0040B240 83E804           sub eax,0040B243 8B00             mov eax,[eax]0040B245 8945E4           mov [ebp-c],eax0040B248 8D4DD4           lea ecx,[ebp-c]0040B24B 8B55E4           mov edx,[ebp-c]0040B24E 4A               dec edx0040B24F A1FC044100       mov eax,[4104fc] // <-- correct one0040B254 E8CFF5FFFF       call TRec.Implicit
4104fc]0040B1F7 8945E8 mov [ebp-],eax0040B1FA 837DE800 cmp DWord ptr [ebp-],0040B1FE 740B jz 40b20b0040B200 8B45E8 mov eax,[ebp-]0040B203 83E804 sub eax,0040B206 8B00 mov eax,[eax]0040B208 8945E8 mov [ebp-],eax0040B20B 8D4DD8 lea ecx,[ebp-]0040B20E 8B55E8 mov edx,[ebp-]0040B211 4A dec edx0040B212 B8FC044100 mov eax,[+++]4104fc // <-- wrong one0040B217 E87CF5FFFF call TRec.&op_Implicit

相同方法的代码:

[+++]

但是,您可以通过为参数类型为TArray< UInt64>的Implicit *** 作符添加另一个重载来避免这种情况。然后还声明您的本地变量为该类型,以便编译器选择正确的重载(在这种情况下它不会生成错误的代码)。

但请注意,这将仅在您传递类型为TArray< UInt64>并且由于Delphis严格类型规则,当您有任何其他UInt64的动态数组时,调用错误的一个。

总结

以上是内存溢出为你收集整理的数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record全部内容,希望文章能够帮你解决数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 11, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录, 附加的程序产生以下输出: ci iA r1 r2 r31 1 1 1 496947644911157522 2 2 2 115705203 3 3 3 04 4 4 4 05 5 5 5 0 > TRec是包含要初始 我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录,

附加的程序产生以下输出:

ci iA r1 r2 r31  1  1  1  496947644911157522  2  2  2  115705203  3  3  3  04  4  4  4  05  5  5  5  0

> TRec是包含要初始化的动态数组的记录类型。
> ci是整数的常数数组。
ia是整数的动态数组。
> r1,r2,r3是以不同方式初始化的TREC类型的记录。

从输出可以看出,前两个赋值(r1,r2),使用常数按预期工作。第三个赋值r3:= iArray被编译器接受,但结果被破坏。调试器显示在TRec.Implicit中v的值已经错误了。

这里出了什么问题?这是可能的吗

program Project5;{$APPTYPE CONSolE}{$R *.res}type  TRec = record    iArray: array of UInt64;    class operator Implicit(const v: array of UInt64): TRec;  end;{ TRec }class operator TRec.Implicit(const v: array of UInt64): TRec;var  i: integer;begin  setlength(Result.iArray,Length(v));  for i := 0 to High(v) do    Result.iArray[i] := v[i];end;const  ciArray: array [0 .. 4] of UInt64 = (1,2,3,4,5);var  i         : integer;  iArray    : array of UInt64;  r1,r2,r3: TRec;begin  iArray := [1,5];  r1 := [1,5];  r2 := ciArray;  r3 := iArray;  Writeln('ci iA r1 r1 r3');  for I := 0 to High(ciArray) do    Writeln(ciArray[i],'  ',iArray[i],r1.iArray[i],r2.iArray[i],r3.iArray[i]);  readln;end.
解决方法 看起来你发现了一个BUG代码在那里(它也存在于Win64编译器)。我查看了生成的asm,似乎编译器会为运算符重载产生错误的指令。这就是为什么错误的值最终在 *** 作符重载的数组中。请在质量门户中报告。

生成错误结果的代码:

Project109.dpr.46: r3 := iArray;0040B1F2 A1FC044100       mov eax,[
Project109.dpr.47: r3 := TRec.Implicit(iArray);0040B22F A1FC044100       mov eax,[4104fc]0040B234 8945E4           mov [ebp-c],eax0040B237 837DE400         cmp DWord ptr [ebp-c],0040B23B 740B             jz 40b2480040B23D 8B45E4           mov eax,[ebp-c]0040B240 83E804           sub eax,0040B243 8B00             mov eax,[eax]0040B245 8945E4           mov [ebp-c],eax0040B248 8D4DD4           lea ecx,[ebp-c]0040B24B 8B55E4           mov edx,[ebp-c]0040B24E 4A               dec edx0040B24F A1FC044100       mov eax,[4104fc] // <-- correct one0040B254 E8CFF5FFFF       call TRec.Implicit
4104fc]0040B1F7 8945E8 mov [ebp-],eax0040B1FA 837DE800 cmp DWord ptr [ebp-],0040B1FE 740B jz 40b20b0040B200 8B45E8 mov eax,[ebp-]0040B203 83E804 sub eax,0040B206 8B00 mov eax,[eax]0040B208 8945E8 mov [ebp-],eax0040B20B 8D4DD8 lea ecx,[ebp-]0040B20E 8B55E8 mov edx,[ebp-]0040B211 4A dec edx0040B212 B8FC044100 mov eax,4104fc // <-- wrong one0040B217 E87CF5FFFF call TRec.&op_Implicit

相同方法的代码:

[+++]

但是,您可以通过为参数类型为TArray< UInt64>的Implicit *** 作符添加另一个重载来避免这种情况。然后还声明您的本地变量为该类型,以便编译器选择正确的重载(在这种情况下它不会生成错误的代码)。

但请注意,这将仅在您传递类型为TArray< UInt64>并且由于Delphis严格类型规则,当您有任何其他UInt64的动态数组时,调用错误的一个。

总结

以上是内存溢出为你收集整理的数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record全部内容,希望文章能够帮你解决数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record_语言综合_内存溢出

数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record

数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record,第1张

概述我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录, 附加的程序产生以下输出: ci iA r1 r2 r31 1 1 1 496947644911157522 2 2 2 115705203 3 3 3 04 4 4 4 05 5 5 5 0 > TRec是包含要初始 我试图弄清楚是否可以使用Delphi(Berlin 10.1 upd 1)中的“implicit”类运算符初始化包含动态数组的记录,

附加的程序产生以下输出:

ci iA r1 r2 r31  1  1  1  496947644911157522  2  2  2  115705203  3  3  3  04  4  4  4  05  5  5  5  0

> TRec是包含要初始化的动态数组的记录类型。
> ci是整数的常数数组。
ia是整数的动态数组。
> r1,r2,r3是以不同方式初始化的TREC类型的记录。

从输出可以看出,前两个赋值(r1,r2),使用常数按预期工作。第三个赋值r3:= iArray被编译器接受,但结果被破坏。调试器显示在TRec.Implicit中v的值已经错误了。

这里出了什么问题?这是可能的吗

program Project5;{$APPTYPE CONSolE}{$R *.res}type  TRec = record    iArray: array of UInt64;    class operator Implicit(const v: array of UInt64): TRec;  end;{ TRec }class operator TRec.Implicit(const v: array of UInt64): TRec;var  i: integer;begin  setlength(Result.iArray,Length(v));  for i := 0 to High(v) do    Result.iArray[i] := v[i];end;const  ciArray: array [0 .. 4] of UInt64 = (1,2,3,4,5);var  i         : integer;  iArray    : array of UInt64;  r1,r2,r3: TRec;begin  iArray := [1,5];  r1 := [1,5];  r2 := ciArray;  r3 := iArray;  Writeln('ci iA r1 r1 r3');  for I := 0 to High(ciArray) do    Writeln(ciArray[i],'  ',iArray[i],r1.iArray[i],r2.iArray[i],r3.iArray[i]);  readln;end.
解决方法 看起来你发现了一个BUG代码在那里(它也存在于Win64编译器)。我查看了生成的asm,似乎编译器会为运算符重载产生错误的指令。这就是为什么错误的值最终在 *** 作符重载的数组中。请在质量门户中报告。

生成错误结果的代码:

Project109.dpr.46: r3 := iArray;0040B1F2 A1FC044100       mov eax,[
Project109.dpr.47: r3 := TRec.Implicit(iArray);0040B22F A1FC044100       mov eax,[4104fc]0040B234 8945E4           mov [ebp-c],eax0040B237 837DE400         cmp DWord ptr [ebp-c],0040B23B 740B             jz 40b2480040B23D 8B45E4           mov eax,[ebp-c]0040B240 83E804           sub eax,0040B243 8B00             mov eax,[eax]0040B245 8945E4           mov [ebp-c],eax0040B248 8D4DD4           lea ecx,[ebp-c]0040B24B 8B55E4           mov edx,[ebp-c]0040B24E 4A               dec edx0040B24F A1FC044100       mov eax,[4104fc] // <-- correct one0040B254 E8CFF5FFFF       call TRec.Implicit
4104fc]0040B1F7 8945E8 mov [ebp-],eax0040B1FA 837DE800 cmp DWord ptr [ebp-],0040B1FE 740B jz 40b20b0040B200 8B45E8 mov eax,[ebp-]0040B203 83E804 sub eax,0040B206 8B00 mov eax,[eax]0040B208 8945E8 mov [ebp-],eax0040B20B 8D4DD8 lea ecx,[ebp-]0040B20E 8B55E8 mov edx,[ebp-]0040B211 4A dec edx0040B212 B8FC044100 mov eax,4104fc // <-- wrong one0040B217 E87CF5FFFF call TRec.&op_Implicit

相同方法的代码:

但是,您可以通过为参数类型为TArray< UInt64>的Implicit *** 作符添加另一个重载来避免这种情况。然后还声明您的本地变量为该类型,以便编译器选择正确的重载(在这种情况下它不会生成错误的代码)。

但请注意,这将仅在您传递类型为TArray< UInt64>并且由于Delphis严格类型规则,当您有任何其他UInt64的动态数组时,调用错误的一个。

总结

以上是内存溢出为你收集整理的数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record全部内容,希望文章能够帮你解决数组 – 使用“Implicit”类运算符初始化包含动态数组的Delphi Record所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1280692.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存