Советы по Delphi. Версия 1.4.3 от 1.1.2001
Шрифт:
– Ralph Friedman
Как
Одной строкой
Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот?
Nomadic отвечает:
A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п.
Типы
У меня константы могут иметь значение, отличное от заданного. Как лечить?
Nomadic советует:
DX.Bug: Const из другого unit'а дает неверное значение.
Симптоматика –
Похоже, это действительно bug, причем ОСОБО ОПАСНЫЙ, т.к. может исказить результаты расчетов, не вызвав заметных нарушений работы программы.
В общем так. Эксперимент показал, что любая вещественная константа, определенная в интерфейсе модуля, может быть неверно (и не обязательно очень неверно – например, вместо 0.7 может появиться 0.115) прочитана в другом модуле. Баг особенно опасен тем, что он неустойчив и может пропадать и возникать без видимых причин (например, возникнуть, если предыдущая компиляция была неудачной и исчезнуть после использования константы в модуле, где она определена).
Лечится (вpоде бы) указанием типа
правда, теперь это уже не совсем константа…
Значение вычисляемого поля Paradox вместо 25.55 становится 24.5499999…
Delphi 1
Значение вычисляемого поля вместо 25.55 у меня выводится как 24.5499999. Скажите, что я делаю неправильно?
Вы не виноваты в ошибке калькуляции!
Я обнаружил ту же проблему в
пакете учета, который я сейчас создаю. Мне кажется, что Borland сам делает в своем коде некий перерасчет значений.Вы можете обойти проблему с помощью функции Round:
ничего экстраординарного, это основное свойство математики плавающей точки, которая обеспечивает точность только в заданном интервале десятичных цифр. Точнее говоря, тип float точен для промежуточных целых чисел и для долей, которые представляют собой сумму компонентов в степени 2, любое другое число округляется исходя из переменной точности (7 цифр для «одинарной» точности, 15 для двойной и 20 для расширенной). Можно использовать процедуру Round или str:
В справке написано, что функция FloatToStr преобразует число в строку с 15 десятичными цифрами – вот почему ваше число отображается столь причудливым образом, попробуйте эту функцию с числами типа 25.5, 25.25, 25.125 или подобными, которые имеют конечное представление в двоичной нотации, и эта проблема должна у вас исчезнуть.
Или используйте функцию FloatToStrF, которой в параметрах необходимо указать общую длину строки и количество десятичных цифр.
Классовые/статические/переменные общего доступа
Delphi 1
Здесь кроется небольшая хитрость: получение эквивалентной функциональности с помощью классового метода. Просто объявите NodeCount как регулярную типизированную константу в секции implementation вашего файла.
Итак, теперь ваш код может выглядеть так, как вы хотели: