Был неправ. Готов искупить и загладить
#pas
dtReal(Fd, FSP^);
dec(cnt); /// Вот тут я сбойнул !!! Думал, что это dec(FSP)
while cnt > 0 do begin
dec(FSP);
dtReal(FItem, FSP^);
Вариант cnt=0 у нас допустим
Для CmdUNFunc, вроде бы - ДА
И чего будет
#pas
CmdUNFunc: // name()
begin
s := ReadProgS;
cnt := PInteger(FPC)^;
inc(FPC, sizeof(integer));
dtString(FItem, s);
_ReadData(FItem,self.X[_prop_ExtNames-1]);
if _IsNULL(FItem) then begin Err := 1; exit; end;
FSP^ := ToReal(FItem);
end;
------------ Дoбавленo в 22.55:
Assasin писал(а):
Кстати, начал работу над оптимизацией. Неужели все должно быть настолько сложно?Хмм.........
Мне, пока, очень не хотелось бы в кодах использовать знание о структуре TResult.
Мало ли чего еще в голову придет на этом Высоко-Интеллектуальном пути....
Пущай у нас будут методы основного класса, имеющие аргументом TResult.
И они, методы (а не мы) знают про FProgram, и как из него чего добыть, или удалить.
Ну твой-то вариант -- не такой уж смертельный
#pas
procedure THIMathParseEx.Level5(var res:TResult); // Логические операции
var op: char;
rs: TResult; //промежуточный результат.
begin
Level6(res); {$ifdef F_P} if Err>=0 then exit; {$endif}
while (Token = 'and')or(Token = 'or')or(Token = 'xor')do begin
op := Token[1];
GetToken; Level6(rs); {$ifdef F_P} if Err>=0 then exit; {$endif}
if isConst(res) and isConst(rs) then begin
case op of
'a': cstVal(res)^ := (cstVal(res)^<>0) and (cstVal(rs)^<>0);
'o': cstVal(res)^ := (cstVal(res)^<>0) or (cstVal(rs)^<>0);
'x': cstVal(res)^ := (cstVal(res)^<>0) xor (cstVal(rs)^<>0);
end;
delConst(rs); // Удаляем из программы константу, на которую указывает rs
end else begin
setVar(res); // Обзываем res - Переменной
case op of
'a': WriteProgB(CmdAnd);
'o': WriteProgB(CmdOr);
'x': WriteProgB(CmdXor);
end;
end;
// Здесь, res - уже должен быть в полной готовности
end;
end;
А хочется, ведь - большего:
#pas
procedure THIMathParseEx.Level5(var res:TResult); // Логические операции
var op: char;
rs: TResult; //промежуточный результат.
begin
Level6(res); {$ifdef F_P} if Err>=0 then exit; {$endif}
while (Token = 'and')or(Token = 'or')or(Token = 'xor')do begin
op := Token[1];
GetToken; Level6(rs); {$ifdef F_P} if Err>=0 then exit; {$endif}
if isConst(res) and isConst(rs) then begin
case op of
'a': cstVal(res)^ := (cstVal(res)^<>0) and (cstVal(rs)^<>0);
'o': cstVal(res)^ := (cstVal(res)^<>0) or (cstVal(rs)^<>0);
'x': cstVal(res)^ := (cstVal(res)^<>0) xor (cstVal(rs)^<>0);
end;
delConst(rs); // Удаляем из программы константу, на которую указывает rs
end else
if isConst(res) and (not isConst(rs)) then begin
setVar(res); // Обзываем res - Переменной
case op of
'a': begin if cstVal(res)^<>0 then delConst(res)
else WriteProgB(CmdAnd); // (false and X) ???
end;
'o': begin if cstVal(res)^= 0 then delConst(res)
else WriteProgB(CmdOr); // (true or X) ???
end;
'x': begin delConst(res);
if cstVal(res)^<>0 then WriteProgB(CmdNot);
end;
end;
end else
if (not isConst(res)) and isConst(rs) then begin
case op of
'a': begin if cstVal(rs)^<>0 then delConst(rs)
else WriteProgB(CmdAnd); // (X and false) ???
end;
'o': begin if cstVal(rs)^= 0 then delConst(rs)
else WriteProgB(CmdOr); // (X or true) ???
end;
'x': begin delConst(rs);
if cstVal(rs)^<>0 then WriteProgB(CmdNot);
end;
end;
end else begin
case op of
'a': WriteProgB(CmdAnd);
'o': WriteProgB(CmdOr);
'x': WriteProgB(CmdXor);
end;
end;
// Здесь, res - уже должен быть в полной готовности
end;
end;
Ну что тут можно сказать....
Пока, только одно в голову приходит: Який же ты Лыцарь, колы голой сракой ежа не вбьешь