Delphi E2029编译报错:期望')'却找到',' 记录赋值问题排查
Delphi E2029编译错误排查:')' expected but ','/';' found
错误触发场景
编译Delphi代码时抛出E2029错误,报错位置在给自定义记录类型TOrbitData赋值的行,错误提示先后为')' expected, but ',' found、')' expected, but ';' found。
相关报错代码片段:
// 记录类型定义 type TOrbitData = record // full orbit data Epoch : TDateTime; KepEl : TKepEl; Cart : TCartesian; Geo : TGeo; end; // 报错的赋值行 CurOrb := TOrbitData(Time, KepEl, Cart, Geo);
根本原因
该写法不符合Delphi语法规则:
- 编译器会将
类型名(...)格式的代码识别为类型强制转换表达式,这类语法的括号内仅允许传入1个待转换的源表达式,不支持传入多个逗号分隔的参数。 - 当编译器解析到第一个参数
Time后的逗号时,判定此处应该出现闭合括号),因此抛出')' expected, but ',' found错误;解析到行尾分号;时仍未找到匹配的闭合括号,因此抛出')' expected, but ';' found错误。 - 你定义的
TOrbitData是普通记录类型,没有声明多参数构造函数,本身也不支持按字段顺序直接传参的类C#风格赋值写法。
修复方案
方案1:逐字段赋值(全版本兼容)
这是兼容性最好的写法,所有Delphi版本均可正常编译运行:
// 注意原记录第一个字段为Epoch,对应时间值要赋值给该字段 CurOrb.Epoch := Time; CurOrb.KepEl := KepEl; CurOrb.Cart := Cart; CurOrb.Geo := Geo;
方案2:使用记录构造语法(新版本Delphi支持)
Delphi 2006及后续版本支持记录的显式构造初始化,可使用命名参数写法:
CurOrb := TOrbitData.Create( Epoch := Time, KepEl := KepEl, Cart := Cart, Geo := Geo );
其他附带代码问题
原代码还存在变量名不匹配的笔误:
- 你声明的TDateTime变量名为
D、T,但赋值时写的是未声明的Dat、Tim - 后续
Epoch := D + T;的计算结果会是未初始化的垃圾值,需要统一前后变量名。
内容的提问来源于stack exchange,提问作者s0laire
相关产品推荐
相关产品推荐

