операторы new и dispose в точности соответствуют процедурам getmem и freemem, за исключением того, что компилитор распределяет количество байт под размер структуры, на которую ссылается переменная-указатель. По этой причине указатель должен быть типизированным указателем, и следущий код неверен:
var
p: pointer;
begin
new(p);
end;
поскольку невозможно установить размер памяти, на которую должен ссылаться указатель. С другой стороны, если вы используете getmem и freemem, вы можете распределять байты для нетепизированного указателя, например:
var p : pointer;
begin
getmem(p, 32767);
…
freemem(p, 32767);
end;
Строки
StrTok для Delphi 2
Delphi 2
Я передалал это для работы в Delphi 2.0, код приведен ниже (эта функция первоначально была написана John Cooper 76356,3601 и модифицирована мной для адаптации под Delphi 2.0).
…вот этот код:
function StrTok(Phrase: Pchar; Delimeter: PChar): Pchar;
const
tokenPtr: PChar = nil;
workPtr: PChar = nil;
var
delimPtr: Pchar;
begin
if (Phrase <> nil) then workPtr := Phrase
else workPtr := tokenPtr;
if workPtr = nil then begin
Result := nil;
Exit;
end;
delimPtr := StrPos(workPtr, Delimeter);
if (delimPtr <> nil) then
begin
delimPtr^ := Chr(0);
tokenPtr := delimPtr + 1
end else tokenPtr := nil;
Result := workPtr;
end;
– Ralph Friedman
Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот?
Одной строкой
Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот?
Nomadic отвечает:
A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п.
Типы
У меня константы могут иметь значение, отличное от заданного. Как лечить?
Nomadic советует:
DX.Bug: Const из другого unit'а дает неверное значение.
Симптоматика –
Unit Main;
Interface
Uses VData;
Const Wko=0.9;
…
Unit VData;
…Implementation
Uses Main;
Procedure ...;
Begin
{ вот здесь Wko=...E+230 - наверное, бесконечность }
End;
Похоже, это действительно bug, причем ОСОБО ОПАСНЫЙ, т.к. может исказить результаты расчетов, не вызвав заметных нарушений работы программы.
В общем так. Эксперимент показал, что любая вещественная константа, определенная в интерфейсе модуля, может быть неверно (и не обязательно очень неверно – например, вместо 0.7 может появиться 0.115) прочитана в другом модуле. Баг особенно опасен тем, что он неустойчив и может пропадать и возникать без видимых причин (например, возникнуть, если предыдущая компиляция была неудачной и исчезнуть после использования константы в модуле, где она определена).
Лечится (вpоде бы) указанием типа
const Wko: double = 0.9;
правда, теперь это уже не совсем константа…
Значение вычисляемого поля Paradox вместо 25.55 становится 24.5499999…
Delphi 1
Значение вычисляемого поля вместо 25.55 у меня выводится как 24.5499999. Скажите, что я делаю неправильно?
Вы не виноваты в ошибке калькуляции!
Я обнаружил ту же проблему в пакете учета, который я сейчас создаю. Мне кажется, что Borland сам делает в своем коде некий перерасчет значений.
Вы можете обойти проблему с помощью функции Round:
SalesIncVAT:=round(SalesIncVAT*100)/100; {дает вам два десятичных порядка}
ничего экстраординарного, это основное свойство математики плавающей точки, которая обеспечивает точность только в заданном интервале десятичных цифр. Точнее говоря, тип float точен для промежуточных целых чисел и для долей, которые представляют собой сумму компонентов в степени 2, любое другое число округляется исходя из переменной точности (7 цифр для «одинарной» точности, 15 для двойной и 20 для расширенной). Можно использовать процедуру Round или str:
var s : string;
begin
str(SalesIncVat:10:2,s); {10 символов для целой части (с точкой) и 2 десятичных цифры}
Label1.Caption:=s;