Вверх ↑
Разработчик
Ответов: 4697
Рейтинг: 426
#1: 2014-06-30 16:03:18 ЛС | профиль | цитата
Galkov писал(а):
Дельфячья строка гарантирует нулик за своим "концом" (для совместимости со всякими другими системами, например WinApi).

А фпцшная?
Galkov писал(а):
Под Дельфи эти супер проверки тупо НЕ НУЖНЫ (зачем ты их там оставил?). Спрашивается, зачем напрягать как компилятор, так и процессор.

Я их с MathParse перенес и не трогал. Слышал, что так сделано потому, что в дельфи то как раз исключения нормально обрабатываются, а в FPC падает всегда. Вот поэтому эти проверки и ограждают от падений. Если бы не это, я бы всегда использовал только исключения, ибо удобнее в разы.
Galkov писал(а):
// Не правда !!! Сначала использование, а потом DEC

Цэ не баг, цэ фича!

Это хитрые оптимизации Если ты заметил, выше идет такой код:
#pas
dtReal(Fd, FSP^);
dec(cnt);
dec(CNT), не FSP, таким образом в цикле прежде чем считать еще одно значение, надо СНАЧАЛА применить dec(FSP), а потом уже считывать. И поэтому в конце не нужен inc(FSP), ибо уже указатель в положении последнего считанного элемента (который по сути должен быть выкинут из стека, но зачем лишний раз напрягаться? Лучше же взять и перезаписать его, не трогая указатель )
Galkov писал(а):
inc(FPC, sizeof(FPC)); // чего-чего ???

А это да. Поправил у себя. И ведь, собака, работает же верно, ибо на x86 sizeof(pointer) = sizeof(integer)
Galkov писал(а):
Очень хочется спросить, а где под условием FreeData(@Fd); Fd := Fitem;...

Не заглядывая в код: по-моему там две переменных, которые в стеке, и одна линкуется к другой через .ldata, после чего уже идет динамически выделенная память в AddMTData. Поэтому можно очистить только остаточный хвост после второй переменной, а первый .ldata подчистится вместе со стеком.
В любом случае заранее добавлю просчет количества элементов в цепочке и просто динамическим массивом буду выделять.
Galkov писал(а):
-- сей код несколько бессмысленен.

Код, может, и бессмысленен, но лучше явно показать, что здесь идет расчет на то, что может использоваться при выполнении результат предыдущих вычислений. Если условия не будет, после правок кода сразу и не разберешься, почему %0 перестал обрабатываться корректно.
------------ Дoбавленo в 16.03:
Кстати, начал работу над оптимизацией. Неужели все должно быть настолько сложно?
#pas
procedure THIMathParseEx.Level5(var res:TResult); // Логические операции
var op: char;
r: TResult; //промежуточный результат.
allConst: boolean; //целиком ли выражение - константа
begin
r.isConst := False;
Level6(res); {$ifdef F_P} if Err>=0 then exit; {$endif}
if res.isConst then begin
r := res;
allConst := True;
end else begin
allConst := False;
end;
while (Token = 'and')or(Token = 'or')or(Token = 'xor')do begin
op := Token[1];
GetToken; Level6(res); {$ifdef F_P} if Err>=0 then exit; {$endif}
if res.isConst then begin
if not r.isConst then begin
r := res;
case op of
'a': WriteProgB(CmdAnd);
'o': WriteProgB(CmdOr);
'x': WriteProgB(CmdXor);
end;
end else begin
case op of
'a': r.value^ := (r.value^ <> 0) and (res.value^ <> 0);
'o': r.value^ := (r.value^ <> 0) or (res.value^ <> 0);
'x': r.value^ := (r.value^ <> 0) xor (res.value^ <> 0);
end;
SetLength(FProgram, Length(FProgram) - sizeof(Real) - 1);
end;
end else begin
allConst := False;
case op of
'a': WriteProgB(CmdAnd);
'o': WriteProgB(CmdOr);
'x': WriteProgB(CmdXor);
end;
end;
end;
res := r;
r.isConst := allConst;
end;
карма: 10
0