Delphi(Delphi11) 编译(compiling)参数优化(optimization) 的N小时调试析
看这诡异的题目,就透着怪诞。
环境:Delphi Win32 Exe
功能:JSONData,加密压缩存档后解压解密(这都木有问题),再转入内存表,写了一段垃圾代码。
{ Jsonarray => memTable }
function JsonToDataSet(Ja:TJSONArray;var DataSet:TFDMemTable;var ErrMsg:String):Boolean; overload
var
I,X: Integer;
jKey, xKey:String;
J : TJSONObject; jEnum:TJSONObject.TEnumerator;
begin
Result := False;
Try
if (Ja = nil) or (DataSet = nil) then Exit;
//自动 创建 字段 DataSet 被清空
if ja[0] = nil then Exit;
if not JsonToDataSet(Ja[0] as TJSONObject,DataSet,ErrMsg) then Exit;
// 内存表创建完毕!
I := 1;{ for 不满足条件不会初始化 I:=1 }
for I := 1 to Ja.Count - 1 do
with DataSet do
begin
Append; // 增加行记录
J := Ja[I] as TJSONObject;
for X := 0 to J.Count - 1 do
begin
// 枚举所有字段
JEnum := J.GetEnumerator;
while JEnum.MoveNext do
Begin
xKey := JEnum.Current.JsonString.Value;
FieldByName(XKey).AsString:= JEnum.Current.JsonValue.Value;
End;
end;
Post; // 提交
end;
ErrMsg:=Format( '%sDataSet.RecordCount=%d %s' , [#13#10#13#10,DataSet.RecordCount,#13#10#13#10 ] );
ErrMsg:= ErrMsg + Format( '%s Ja.Count = %d %s' , [#13#10#13#10,Ja.Count,#13#10#13#10 ] );
ErrMsg:= ErrMsg + Format( '%s I = %d %s' , [#13#10#13#10, I ,#13#10#13#10 ] );
raise Exception.Create(ErrMsg);
Result := (DataSet.RecordCount = I );
Except
On E : Exception Do errMsg := E.Message;
End;
end;
这里算法逻辑是:
传入的Ja数组,Ja[0]有效,初始化内存表。
利用For循环添加剩余记录,那么
问题
来了!!!!!!!!!!!!!!
Delphi11,默认
compiling.optimization = false, 我是开启优化处理的。
这是调试,看输出:
DEBUG模式
调试 Raise 实际是成功的。
再看:
RELEASE模式
取消
编译(compiling)参数优化(optimization)
跟开发调试过程一样一样的。
优化:
**I := 1;{ for 不满足条件不会初始化 I:=1 }
for I := 1 to Ja.Count - 1 do**
就是,就是,就是… …
高手指点。
总结
不要为了少定义一个变量,少一行代码而花费几个小时找问题~~~~~~~~~~~~~~~~~~~~~~