Delphi 11:常量对象不能作为 var 参数传递

Posted

技术标签:

【中文标题】Delphi 11:常量对象不能作为 var 参数传递【英文标题】:Delphi 11: Constant object cannot be passed as var parameter 【发布时间】:2021-11-13 13:42:25 【问题描述】:

我正在尝试将我的 Delphi 7 代码转移到 Delphi 11。

以下代码在 Delphi 7 中运行良好,但在 Delphi 11 中出现编译时错误

[dcc32 错误] VELOS.PAS(44): E2197 常量对象不能作为 var 参数传递

有没有办法让 Delphi 11 编译我的代码?

我可以将初始化常量设为全局初始化 var,但更改所有类似代码以符合 Delphi 11 需要大量工作,因为我经常使用类似的东西。

我的代码:

function Kt_f25(Mrd,Md,aro,dh:real; var k:real):real;
const
  vmax=9;
type
  Atype=array [1..vmax] of real;
const
  arA:Atype=(    10,  15,  20,  25,  30,  40,  60, 100, 200);

  v0a08:  Atype=( 235, 170, 135, 115, 100,  82,  63,  46,  33);
  v1a08:  Atype=( 135, 102,  84,  74,  67,  57,  47,  37,  30);

  v0a09:  Atype=( 166, 118,  95,  80,  70,  57,  44,  33,  23);
  v1a09:  Atype=(  99,  76,  63,  56,  50,  43,  36,  29,  22);

  v0a10:  Atype=( 120,  86,  70,  59,  51,  42,  32,  24,  17);
  v1a10:  Atype=(  77,  59,  50,  44,  40,  34,  28,  22,  16);

  dhA:array [1..3] of real=(8,9,10);
var
  v0,v1,v2,kt:real;
  res:array [1..3] of real;    
begin
  if Md>0 then k:=Mrd/Md else if Mrd=0 then k:=1 else k:=10;
  if k>1.3 then k:=1.3;
  if k<0 then k:=0;

  v0:=LinearApr(arA,v0a08,aro*1000,vmax); v1:=LinearApr(arA,v1a08,aro*1000,vmax); v2:=20;
  if k>=1 then res[1]:=v2+k*(v1-v2)/0.2 else res[1]:=v1+k*(v0-v1)/1.0;

  v0:=LinearApr(arA,v0a09,aro*1000,vmax); v1:=LinearApr(arA,v1a09,aro*1000,vmax); v2:=20;
  if k>=1 then res[2]:=v2+k*(v1-v2)/0.2 else res[2]:=v1+k*(v0-v1)/1.0;

  v0:=LinearApr(arA,v0a10,aro*1000,vmax); v1:=LinearApr(arA,v1a10,aro*1000,vmax); v2:=20;
  if k>=1 then res[3]:=v2+k*(v1-v2)/0.2 else res[3]:=v1+k*(v0-v1)/1.0;

  kt:=LinearApr(dhA,res,dh*10,3);

  Result:=kt/10;
end;

function LinearApr(var ap1,AV1; r:real; Vmax:integer):real;
const gmax=100;                                                          
type
  Atype=array [1..gmax] of real;
var
  i,j:integer;
  ap2:Atype absolute ap1;
  AV2:Atype absolute AV1;
  ap,AV:Atype;
begin
...
end;

【问题讨论】:

第 44 行是哪一行? 【参考方案1】:

错误是不言自明的。您正在传递需要变量引用的类型常量。

您在 Delphi 7 和 11 之间遇到以下行为变化:

Writeable typed constants (Delphi)

$J 指令控制是否可以修改类型化常量。 $J+ 状态下,类型化常量可以修改,本质上是初始化变量。$J- 状态下,类型化常量是真正的常量,任何修改类型化常量的尝试都会导致编译器报错。

...

在 Delphi 和 Object Pascal 的早期版本中,类型化常量始终是可写的,对应于$J+ 状态。使用可写类型常量的旧源代码必须在$J+ 状态下编译,但对于新应用程序,建议您使用初始化变量并在$J- 状态下编译代码。

在现代 Delphi 版本中,默认状态是 $J-。因此,只需在现有代码中添加显式 $J+$WRITEABLECONST ON 指令即可获得旧行为。

【讨论】:

非常感谢。它有效。

以上是关于Delphi 11:常量对象不能作为 var 参数传递的主要内容,如果未能解决你的问题,请参考以下文章

delphi const

为啥我不能将常量数组作为参数传递?

不能将类引用用作非类型模板参数

delphi 7 中数组如何当参数

为啥字符串函数有一些参数作为 const char *(指向常量字符的指针)?

Delphi;传递const字符串与传递var字符串的性能