Вверх ↑
Ответов: 9906
Рейтинг: 351
#1: 2014-06-30 10:58:14 ЛС | профиль | цитата
Это правда.
Ничем этот код не хуже: что раньше было два логических сравнения, что сейчас - те же два.


------------ Дoбавленo в 08.17:
Assasin, для сведения:
Дельфячья строка гарантирует нулик за своим "концом" (для совместимости со всякими другими системами, например WinApi).
Следовательно, ты зря напрягался за этот код:

#pas
i := length(FProgram);
SetLength(FProgram,i+length(str)+1);
Move(str[1], FProgram[i], length(str)+1);
-- это не ошибка, так просто короче
------------ Дoбавленo в 09.16:
Ыще
Чувствую недопонимание :
#pas
CmdDiv: {$ifdef F_P}if x2=0 then begin Err:=2;Exit;end else{$endif}
Fsp^ := Fsp^ / x2;
Под Дельфи эти супер проверки тупо НЕ НУЖНЫ (зачем ты их там оставил?). Спрашивается, зачем напрягать как компилятор, так и процессор.
Исключения - есть объективная данность камня, и тебя никто не спрашивал, нравятся они тебе, или нет.
Они все равно произойдут (ни о чем тебя не спрашивая).
Просто - посчитай чего нибудь типа 200^200. И ощути разницу между Дельфи и FPC.
Второй делал проверки, и все равно упал. А первый не делал - и все нормально (в смысле - сообщает об ошибке никуда не падая).
Ибо настоящая проверка делается в камне. И фиг ты сделаешь ее "самостоятельно".
В камне - чтобы пользователь мог заниматься делом, а не проверкой осуществимости своих делов.
Собственно, и наша то задача - Калькулятор, а не Проверятель Возможности Калькуляции.

А упасть можно и на умножении (как в вышеприведенной формуле, ибо там работает IntPower, который есть умножение), так и на сложении.
------------ Дoбавленo в 09.49:
Ыще
#pas
TRY
if cnt > 0 then begin
dtReal(Fd, FSP^);
dec(cnt);
while cnt > 0 do begin
dec(FSP); // Не правда !!! Сначала использование, а потом DEC
dtReal(FItem, FSP^);
AddMTData(@FItem, @Fd, tmp);
FreeData(@Fd);
Fd := FItem;
dec(cnt);
end;
end;
FItem := Fd;
_ReadData(FItem,self.X[i]);
FINALLY
FreeData(@Fd);
END;
if _IsNULL(FItem) then begin Err := 1; exit; end;
// Сначала INC (и где он ???), а потом запись
FSP^ := ToReal(FItem);
-- два раза.------------ Дoбавленo в 09.53:
Ыще
#pas
cnt := PInteger(FPC)^;
inc(FPC, sizeof(FPC)); // чего-чего ???
-- два раза.------------ Дoбавленo в 10.34:
Ыще
#pas
dtString(FItem, s);
if not _IsNull(Fd) then begin
AddMTData(@FItem, @Fd, tmp);
end;
Очень хочется спросить, а где под условием FreeData(@Fd); Fd := Fitem;...
Но не буду.
Ибо от этого геморроя надо избавляться по любому.
Он же, собака, оказывается -- более навороченный, чем в оригинальном MathParse...
------------ Дoбавленo в 10.58:
Ыще
#pas
i := Str2Int(Token)-1;
if i=-1 then begin
WriteProgB(CmdRead);
WriteProgB(255);
end else if i<FDataCount then begin
-- сей код несколько бессмысленен.Достаточно:
#pas
i := Str2Int(Token)-1;
if i<FDataCount then begin
-- ИБО: byte(-1)=255
карма: 9

0