![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Кака лучше?
Fr © (2012-04-15 13:23:00)Практически везде в предоставляемых кусках кода есть такое:
for i:=0 to SL.Count-1 do ...
Почему вместоSL.Count-1не используетсяPred(SL.Count)?
В чем здесь подвох? Может одна операция действует быстрее другой? Или может возникнуть какая-нибудь проблема при использованииPred(SL.Count)?
Sha (2012-04-17 14:40:00) [1]> CRLF (17.04.12 14:35) [57]
> Когда-нибудь First + Count станет больше High(Array)
есть if и if, почувствуй разницу
> в реальной вряд ли кто-то кроме преподавателя информатики
> станет без нужды поддиапазоны выделять
опять же (с) ЮЗ:
любую полезную вещь можно превратить в бесполезную (или даже вредную),
доведя ее до абсурда.
CRLF (2012-04-17 14:35:00) [2]А разве нет? Когда-нибудь First + Count станет больше High(Array), массив к тому времени будет динамическим и без лишней типизации, в 99% выход за пределы массива будет прощаться, но раз в полгода будет ав... :-)
> Это не тот код, чтобы думать. Тут надо струячить. Думать
> надо редко.
Ну да, это ведь "форумные этюды", а не реальная задача, в реальной вряд ли кто-то кроме преподавателя информатики станет без нужды поддиапазоны выделять.
Sha (2012-04-17 14:26:00) [3]разве эти вещи как-то связаны?
CRLF (2012-04-17 14:24:00) [4]
> P.S. меня бесят все эти if и raise...
Неужели лучше, если через эн лет в проверенном годами коде изредка станет возникать ав по причине выхода за пределы массива?
Sha (2012-04-17 14:10:00) [5]Это не тот код, чтобы думать. Тут надо струячить. Думать надо редко.
При сплошном типизировании приходится думать непрерывно. Думалка может сломаться.
Sha (2012-04-17 14:07:00) [6]Спорим, одного не хватит?
P.S. меня бесят все эти if и raise...
CRLF (2012-04-17 14:03:00) [7]А в чём извращение? В добавлении одного if (лишнего, но, в принципе, повышающего читаемость)?
Sha (2012-04-17 13:57:00) [8]Во.
И придется поизвращаться, чтобы этого избежать.
Спрашивается, нафига было типизировать?
CRLF (2012-04-17 13:50:00) [9]Да, действительно, с range checking проблема есть.
Sha (2012-04-17 13:27:00) [10]> CRLF (17.04.12 12:11) [48]
Проверил на D7
Optimization Off
RangeChecking On
OverFlowChecking On
ERangeError есть
CRLF (2012-04-17 12:11:00) [11]
> А компилятор, собака, об этом знает, но ERangeError поднимает.
Опять же, прогнал твой пример из [28] с моими доработками, никакого RangeError нету.
Sha (2012-04-17 12:09:00) [12]Вот-вот.
А компилятор, собака, об этом знает, но ERangeError поднимает.
Но мы бум молчать.
CRLF (2012-04-17 12:06:00) [13]Попался в чём? Цикл не выполнится ни разу. То, что Pred(First + Count) будет иметь недопустимое для TNumber значение, — имеет ли смысл об этом говорить, если присвоения не будет никогда?
Sha (2012-04-17 11:55:00) [14]> CRLF (17.04.12 11:40) [42]
Попался )
Засада там же: Count=0
Sha (2012-04-17 11:49:00) [15]> Anatoly Podgoretsky © (17.04.12 11:40) [43]
Конечно нельзя, поэтому и придется переписать
CRLF (2012-04-17 11:40:00) [16]
> приводит нас либо к усложнению кода
Некоторое усложнение, конечно, есть, но...
type
TNumber= 1..100;
TRooms= array[TNumber] of integer;
function Volume(const Rooms: TRooms; First: TNumber; Count: integer): integer;
по большому счёту некорректен. Если уж типизируем, то нужно
type
TNumber= 1..Max;
TQuantity = 0..Max;
TRooms= array [TNumber] of integer;
function Volume(const Rooms: TRooms; First: TNumber; Count: TQuantity): integer;
var
Current: TNumber;
begin
if First + Count > Max then
raise ...;
Result := 0;
for Current := First to Pred(First + Count) do
Result := Result + Rooms[Current];
end;
Anatoly Podgoretsky (2012-04-17 11:40:00) [17]
> Sha © (17.04.12 11:36) [41]
> если вдруг приспичит сделать врхнюю границу массива переменной.
Не понял, поясни, а то я до сих пор считал, что нельзя определить массив, с граница с переменными.
Sha (2012-04-17 11:36:00) [18]Да с кодом и так все ясно. Все придется переписать,
если вдруг приспичит сделать врхнюю границу массива переменной.
Anatoly Podgoretsky (2012-04-17 11:20:00) [19]> Sha (17.04.2012 11:17:39) [39]
Автор является последней инстанцией, как писать, что использовать, усложнять
или нет
Это я не обсуждаю, только приведеный код.
Sha (2012-04-17 11:17:00) [20]> CRLF
> Anatoly Podgoretsky
Вы немного не о том (корректно/некорректно).
Понятно, что формально неверно, но на практике надо.
Понятно, как исправить ценой усложнения кода, чтобы было формально верно.
Речь о другом немного.
О том, что тупое следование принципу типизации всего и вся приводит нас
либо к усложнению кода (нарушению другого известного принципа),
либо к появлению в коде почти незаметных ошибок,
которые являются таковыми только с точки зрения компилятора.