Vlad04 писал(а):wwswowsogon писал(а):Да, с этим кодом что-то не так.Но я, вроде бы, такого не писал в демо. Вы на что-то намекаете?
Думайте. Включите в параметрах проекта на вкладке Отладка проверку диапазона.
Ради эксперимента создал отдельную демку с вышеприведённым кодом:
- Код: Выделить всё
var
i, k: Byte;
//i, k: Word;
//i, k: Smallint;
begin
k := 0;
for i := 0 to k - 1 do
begin
ShowMessage(IntToStr(i));
end;
Был удивлён. Если i и k - Integer / Smallint, цикл не выполняется. Если же i и k - Byte / Word, то выполняется, хотя на мой взгляд не должен. И i в цикле возрастает от 0 до... проверять не стал, но рискну предположить, что до верхней границы диапазона данного типа минус то число, которое вычитается из k, в данном случае 1. Но это оооочень странно.

Понять логику происходящего, по-видимому, выше моих сил. По-видимому, разница поведения как-то связана с тем, что Byte и Word - беззнаковые типы, а Integer и Smallint - знаковые. Ну и да, если включить проверку в Отладке, то при использовании Byte / Word получаем Range Check Error.
Кстати, в определённых случаях, при использовании типа Byte компилятор предупреждает, что значение переменной может выходить за пределы диапазона.
Хороший урок, спасибо


Ну и, как я и говорил, замена Word на Integer проблему в проекте не решило. Если не ошибаюсь, ровно те же глюки.