Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Кака лучше?   Найти похожие ветки 

 
Fr   (2012-04-15 13:23) [0]

Практически везде в предоставляемых кусках кода есть такое:
for i:=0 to SL.Count-1 do ...

Почему вместо SL.Count-1 не используется Pred(SL.Count)?

В чем здесь подвох? Может одна операция действует быстрее другой? Или может возникнуть какая-нибудь проблема при использовании Pred(SL.Count)?


 
brother ©   (2012-04-15 13:24) [1]

какая такая кака???


 
Сергей М. ©   (2012-04-15 13:33) [2]

"Кака" - она в "Практически везде"


 
Fr   (2012-04-15 13:42) [3]


> какая такая кака???

Читать не "кака", а "как" :)  Не виноват я, что здесь отсутствует система исправления своих сообщений. Поэтому при наборе текста и возникают такие ошибки.

А что по существу вопроса?


 
RWolf ©   (2012-04-15 13:50) [4]

Пишется проще, читается легче, по скорости одинаково.


 
Anatoly Podgoretsky ©   (2012-04-15 16:01) [5]

Скомпилируй обе каки и сравни код.


 
Sha ©   (2012-04-15 17:56) [6]

вторая кака хуже - она заставляет думать


 
DVM ©   (2012-04-15 18:40) [7]


> вторая кака хуже - она заставляет думать

второй вариант более удобен в массивах

a: array[0..Pred(256)] of ...

Наглядно показывает количество элементов в массиве


 
Sha ©   (2012-04-15 19:43) [8]

на мой взгляд 255 удобнее


 
Fr   (2012-04-15 21:43) [9]

Спасибо всем. Насколько я понял, принципиальной разницы нет, как делать. все зависит от восприятия пишущего и читающего :)


 
CRLF   (2012-04-15 22:57) [10]

На мой взгляд array [Byte] of ... удобней, и с обязательным объявлением именованного типа.


 
Германн ©   (2012-04-16 01:59) [11]


> На мой взгляд array [Byte] of ... удобней

Но работает только для конкретного примера в DVM ©   (15.04.12 18:40) [7]


 
Германн ©   (2012-04-16 02:07) [12]

А в целом все эти функции/процедуры Pred, Succ, Inc, Dec, Include, Exclude (может и ещё какие-то были) были "временной оптимизацией скорости выполнения" в эпоху Турбо Паскаля и может быть в эпоху Д1. Сейчас они никакой оптимизации не добавляют. И как правило лишь мешают воспринимать код тем, кто начал заниматься программированием после вышеназванной эпохи.


 
CRLF   (2012-04-16 10:31) [13]


> Но работает только для конкретного примера в DVM
Ну да, в прочих случаях объявляем TIndex = IndexMin..IndexMax; TArray = array [TIndex] of TElement;


 
Ega23 ©   (2012-04-16 11:04) [14]


> Почему вместо  SL.Count-1 не используется Pred(SL.Count)?


С Савёловского вокзала до Белорусского в default city можно добраться:
1. На электричке
2. На такси.
3. Наземный транспорт (трамвай там какой-то ходил, вроде).

Почему большинство предпочитает всё-таки на метро добираться?


 
CRLF   (2012-04-16 11:55) [15]


> А в целом все эти функции/процедуры Pred, Succ, Inc, Dec,
>  Include, Exclude (может и ещё какие-то были) были "временной
> оптимизацией скорости выполнения" в эпоху Турбо Паскаля
> и может быть в эпоху Д1. Сейчас они никакой оптимизации
> не добавляют. И как правило лишь мешают воспринимать код
> тем, кто начал заниматься программированием после вышеназванной
> эпохи.
Неправда. Inc, Dec, Pred, Succ, Low, High работают с любыми перечислимыми типами. +-1 -- только с арифметическими.


 
Anatoly Podgoretsky ©   (2012-04-16 12:05) [16]


> Но работает только для конкретного примера в DVM ©   (15.
> 04.12 18:40) [7]

Работает с любыми перечислимыми типами


 
Юрий Зотов ©   (2012-04-16 16:07) [17]


> CRLF   (16.04.12 10:31) [13]
> в прочих случаях объявляем TIndex = IndexMin..IndexMax;
> TArray = array [TIndex] of TElement;

И получаем проблемы либо с несовместимостью типов, либо с выходом за диапазон.

const
 IndexMin = ...;
 IndexMax = ... ;

type
 TIndex = IndexMin..IndexMax;
 TArray = array [TIndex] of ...;

var
 i: integer;
 j: TIndex;
 a: TArray;
begin
 for i := IndeхMin to IndexMax do
   a[i] := ...; // Несовместимость типов
 for j := IndeхMin to IndexMax do ...; // Выход за диапазон
end;

Мне тоже нравится строгость Паскаля, она спасает от многих ошибок. Но любую полезную вещь можно превратить в бесполезную (или даже вредную), доведя ее до абсурда.


 
Омлет ©   (2012-04-16 16:18) [18]


> Юрий Зотов ©   (16.04.12 16:07) [17]
> либо с выходом за диапазон.

low, high спасают.


 
CRLF   (2012-04-16 16:48) [19]


> for j := IndeхMin to IndexMax do ...; // Выход за диапазон
Поясни, о каком выходе идёт речь.


 
Юрий Зотов ©   (2012-04-16 16:57) [20]


> CRLF   (16.04.12 16:48) [19]

После последнего витка цикла его счетчик еще раз инкрементируется и выходит за диапазон.


 
CRLF   (2012-04-16 17:06) [21]

Действительно, выход за пределы диапазона есть, в том числе и при использовании Low, High.
Но так как параметр цикла вне цикла имеет неопределённое значение и компилятор об этом предупреждает, вряд ли это можно считать проблемой.


 
RWolf ©   (2012-04-16 17:16) [22]


> Юрий Зотов ©   (16.04.12 16:07) [17]


> for j := IndeхMin to IndexMax do ...; // Выход за диапазон


> Действительно, выход за пределы диапазона есть


какой такой выход?
вы меня пугаете.


 
Юрий Зотов ©   (2012-04-16 17:19) [23]


> CRLF   (16.04.12 17:06) [21]
> вряд ли это можно считать проблемой.

Если контроль выхода за диапазон выключен, то да, не проблема. А у меня, например, есть привычка держать его включенным и отключать только при билде релиза. И если в коде есть подобные конструкции, то выскакивающие из-за них окошки исключений очень сильно мешают.


 
RWolf ©   (2012-04-16 17:23) [24]

вот прямо сейчас запустил код на Д7:

procedure TForm1.Button1Click(Sender: TObject);
const
 IndexMin = 11;
 IndexMax = 322;

type
 TIndex = IndexMin..IndexMax;
 TArray = array [TIndex] of byte;

var
 j: TIndex;
 a: TArray;
begin
 for j := IndexMin to IndexMax do
   caption:=caption+IntToStr(a[j]);
end;


Range checking включен, процедура работает без ошибок.


 
CRLF   (2012-04-16 17:30) [25]


> Юрий Зотов ©   (16.04.12 17:19) [23]
Специально проверял, range check error не возникает. Delphi XE2.


 
Юрий Зотов ©   (2012-04-16 17:35) [26]


> CRLF   (16.04.12 17:30) [25]
> RWolf ©   (16.04.12 17:23) [24]

Приду домой - проверю, сейчас Delphi нет под рукой.


 
Юрий Зотов ©   (2012-04-16 21:21) [27]

Проверил (D7) - ошибка действительно не возникает. Сорри.

Но возникает вопрос - откуда же я это взял, не из головы же придумал? Точно помню, что эти ошибки были.

Видимо, это было еще в Паскале, а на Delphi перенес по привычке.


 
Sha ©   (2012-04-17 01:23) [28]


type
 TNumber= 1..100;
 TRooms= array[TNumber] of integer;

function Volume(const Rooms: TRooms; First: TNumber; Count: integer): integer;
var
 Current: TNumber;
begin;
 Result:=0;
 for Current:=First to First+Count-1 do Result:=Result+Rooms[Current];
 end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Rooms: TRooms;
 Current: TNumber;
begin;
 for Current:=Low(Rooms) to High(Rooms) do Rooms[Current]:=2;
 Volume(Rooms,2,2);
 Volume(Rooms,2,0);
 Volume(Rooms,1,1);
 Volume(Rooms,1,0);
 end;


 
CRLF   (2012-04-17 07:43) [29]


> Sha ©   (17.04.12 01:23) [28]
Не совсем понятно, что ты хотел продемонстрировать, но... Во-первых, нужно проверять, что Count > 0. Во-вторых, смешивать TNumber и Integer потенциально опасно (что, видимо, пример и демонстрирует).


 
Sha ©   (2012-04-17 08:54) [30]

> CRLF   (17.04.12 07:43) [29]
> Не совсем понятно, что ты хотел продемонстрировать

1. То, что количество объектов (комнат, символов и т.п.) может быть получено в результате вычислений.
2. То, что 0 - это вполне корректное количество объектов (это не -1, не -2 и т.п.). Обычно его не надо предварительно ни при Copy, ни при Move и т.п., я привык не проверять. Ведь 1 я не проверяю.
3. То, что теперь мне не совсем понятно, как в моем случае должен выглядеть цикл с нулевым количеством повторений. Непонятно почему (ну, мне понятно почему) компилятору пофиг, если такой цикл начинается с любого элемента и не пофиг, если с первого.
4. Все это тем более непонятно, что обычно количество повторений цикла for компилятор вычисляет заранее.
5. То, прав Юрий Зотов: любую полезную вещь можно превратить в бесполезную (или даже вредную), доведя ее до абсурда.


 
Sha ©   (2012-04-17 08:57) [31]

Обычно его не надо предварительно проверять*


 
Anatoly Podgoretsky ©   (2012-04-17 09:00) [32]


> Юрий Зотов ©   (16.04.12 21:21) [27]

Померещилось конечно.
Причин для выхода нет совсем, когда границами является размерность массива. В Паскале тоже самое.
Более того я ранее обычно писал так, с использование констант границ и использованием из в виде индекса и размерности.
А выражение array x[TYPE] означает array x[Low(TYPE)..High(TYPE)] сокращеная форма.


 
Anatoly Podgoretsky ©   (2012-04-17 09:03) [33]


> Во-вторых, смешивать TNumber и Integer потенциально опасно
> (что, видимо, пример и демонстрирует).

А не надо смешивать, например как в [24]


 
CRLF   (2012-04-17 09:16) [34]


> как в [24]
как в [28] ;-)


 
Anatoly Podgoretsky ©   (2012-04-17 09:50) [35]

Там другой вариант, тоже правильно реализованый

Current: TNumber;


 
CRLF   (2012-04-17 10:00) [36]

Но ему присваивается результат от операции TNumber c Integer, что может быть некорректно. Не говоря уже о том, что "количество" в примере может быть отрицательным и это никак не проверяется.


 
Anatoly Podgoretsky ©   (2012-04-17 10:09) [37]

for Current:=Low(Rooms) to High(Rooms) do Rooms[Current]:=2;А Rooms это размерность TNumber, который является константой, а чем это станет зависит от использования, TNumber полностью совместим с Integer, поскольку является поддиапазоном последнего.

for Current:=Low(Rooms) to High(Rooms) do Rooms[Current]:=2;

Это является надежным аналогом

for Current:=1 to 100 do Rooms[Current]:=2;

Ясно же что константы и производные типы безопаснее и понятнее.


 
Anatoly Podgoretsky ©   (2012-04-17 10:11) [38]

[24] пошел в дальше, там уже использованы именованые константы диапазона, вместо 1..100


 
Sha ©   (2012-04-17 11:17) [39]

> CRLF
> Anatoly Podgoretsky

Вы немного не о том (корректно/некорректно).
Понятно, что формально неверно, но на практике надо.
Понятно, как исправить ценой усложнения кода, чтобы было формально верно.

Речь о другом немного.
О том, что тупое следование принципу типизации всего и вся приводит нас
либо к усложнению кода (нарушению другого известного принципа),
либо к появлению в коде почти незаметных ошибок,
которые являются таковыми только с точки зрения компилятора.


 
Anatoly Podgoretsky ©   (2012-04-17 11:20) [40]

> Sha  (17.04.2012 11:17:39)  [39]

Автор является последней инстанцией, как писать, что использовать, усложнять
или нет
Это я не обсуждаю, только приведеный код.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.069 c
15-1333440113
MonoLife
2012-04-03 12:01
2013.03.22
Aser Aspire one & Asus WL-500g Premium v.2


15-1335247067
99999
2012-04-24 09:57
2013.03.22
Проверить синтаксис.


2-1334939002
leklerk
2012-04-20 20:23
2013.03.22
Как сделать, чтобы в dbgrid всегда была прокрутка?


15-1335001121
antonn
2012-04-21 13:38
2013.03.22
релюшка на 220


15-1345250502
RGV
2012-08-18 04:41
2013.03.22
Товарищи! Нужна помощь!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский