Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2011, 21:28   #11
celovec
Форумчанин
 
Регистрация: 15.06.2007
Сообщений: 182
По умолчанию

Покажите пожалуйста как это делается с case
celovec вне форума Ответить с цитированием
Старый 04.07.2011, 21:35   #12
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> сравнивать не строки, а сумму кодов их символов

да, тоже вариант. Или контрольную сумму:

Код:
case (crc32(Edit1.Text)) of

  $D8932AAC: ; // hi
  $A79BF505: ; // opi
  $A47083A4: ; // open
  
end;
но это уже из серии квантовой оптимизации, для обычной лабы подойдёт пример с if .. else.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 04.07.2011 в 21:37.
veniside вне форума Ответить с цитированием
Старый 04.07.2011, 21:38   #13
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,087
По умолчанию

Цитата:
Сообщение от zumm Посмотреть сообщение
А вообще, если проверок достаточно много, то использовать удобнее все тот же case, только сравнивать не строки, а сумму кодов их символов. шанс на совпадение сумм в обычных условиях стремится к нулю.
Ага. И плевать нам на позиции символов. Что "код", что "док" - одно и то же. Ну и трудноуловимые баги выстроятся дружно вокруг этого кода.
Нормальные люди в случае большого числа проверок используют ассоциативные контейнеры/коллекции и иже с ними.

Назовите мне хоть один пример необходимости длинного case/if ... else if. Сравнение со строками - это в коде сравнение с магическими словами? С кучей магических слов? И наверняка эти слова будут по коду повторяться?

Последний раз редактировалось pu4koff; 04.07.2011 в 21:41.
pu4koff вне форума Ответить с цитированием
Старый 04.07.2011, 21:40   #14
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

На счёт квантовых материй - инструкция case полностью идентична ...else if... и нужна программисту только для удобства при написании кода.
eoln вне форума Ответить с цитированием
Старый 04.07.2011, 21:42   #15
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

Цитата:
Код:
if (edit1.text = 'hi') then begin
    ***
  end else 
if (edit1.text = 'орi') and (edit2.Text='kj') then begin
    ***
  end else 
  if (edit1.text = 'hi') or (edit1.text = 'open') then begin
    ***
end;
Возможно его можно как-то по другому оптимизировать?
В таком виде третья ветка
Цитата:
f (edit1.text = 'hi') or (edit1.text = 'open') then begin
НИКОДА не будет выполнена первое условие повторяет условие первой ветки. и все что могло бы быть здесь выполнено пойдет изначально по первому пути
Цитата:
if (edit1.text = 'hi') then begin
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.07.2011 в 21:45.
evg_m на форуме Ответить с цитированием
Старый 04.07.2011, 21:45   #16
celovec
Форумчанин
 
Регистрация: 15.06.2007
Сообщений: 182
По умолчанию

Спасибо большое всем. Вопрос решён.

evg_m, да, вы правы, просто неудачно привел пример.
celovec вне форума Ответить с цитированием
Старый 04.07.2011, 21:47   #17
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> инструкция case полностью идентична ...else if

это в описании языка она идентична, а в скомпилированном виде разница там бывает весьма заметна )

> и нужна программисту только для удобства при написании кода

а компилятору для удобства оптимизации


> Назовите мне хоть один пример необходимости длинного case/if ... else if.

ну, например, на сервер приходит трехсимвольная команда от клиента. команд много, скажем, 1000.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 04.07.2011 в 21:50.
veniside вне форума Ответить с цитированием
Старый 04.07.2011, 21:49   #18
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Цитата:
Ага. И плевать нам на позиции символов. Что "код", что "док" - одно и то же. Ну и трудноуловимые баги выстроятся дружно вокруг этого кода.
Нормальные люди в случае большого числа проверок используют ассоциативные контейнеры/коллекции и иже с ними.
Никто не сказал что работает это всегда. Так просто один из шаманских способов для конкретной ситуации. А если уж и писать для большого числа проверок то вот так как то:

Код:
var
  array_control: array of string;

{
...
создать и заполнить массив словами для проверки, или сделать это еще в объявлении.
...
}

for i:=0 to length(array_control)-1 do
  if edit1.text=array_control[i] then
  begin
    case i of
      1: begin
        //логика
      end;
      2: begin
        //логика
      end;
  end;
или зафигачить вообще структуру с указателем на функцию которую нужно выполнить если проверка совпала, и тогда в этом цикле необходимость в case отпадает
В планах порабощение вселенной...

Последний раз редактировалось zumm; 04.07.2011 в 21:53.
zumm вне форума Ответить с цитированием
Старый 04.07.2011, 22:02   #19
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,087
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
ну, например, на сервер приходит трехсимвольная команда от клиента. команд много, скажем, 1000.
Не дай бог мне такое когда-то придётся поддерживать.
это минимум 1000 строк кода, которые вызывают нужные функции. Это получается функция/метод класса в тысячу строк... ужас...
Такое обычно реализуется посредством массивов или других коллекций. Нормальные люди не пишут 1000 case.
Даже некоторые оптимизаторы некоторых компиляторов некоторых языков умеют заменять case на отсортированный массив, что очень сильно ускоряет поиск нужной ветки программы.
pu4koff вне форума Ответить с цитированием
Старый 04.07.2011, 22:10   #20
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> умеют заменять case на отсортированный массив

так это и есть задача компилятора, пусть думает, как лучше такой case замутить, массивом, коллекцией или ещё каким-то встроенным средством нового процессора, чё у программиста голова должна болеть? )

> получается функция/метод класса в тысячу строк... ужас...

если ужас красиво оформлен, имхо, ничё страшного )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц