Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.02;
Скачать: CL | DM;

Вниз

Работа с case   Найти похожие ветки 

 
Tumcoat   (2003-09-18 02:34) [0]

Господа такой вопрос

case I of

1..5: Caption := "Low";
6..9: Caption := "High";
0, 10..99: Caption := "Out of range";
else
Caption := "";
end;


Почему значения I могут быть только integer?
Хотя в хелпе есть такой пример:

case MyColor of

Red: X := 1;
Green: X := 2;
Blue: X := 3;
Yellow, Orange, Black: X := 0;
end;


Тут ведь явно не integer?


 
jack128 ©   (2003-09-18 02:51) [1]

i - любой перечисляемый тип. Учим паскаль
Варианты в case - того же типа что и i


 
Tumcoat   (2003-09-18 04:11) [2]


> jack128 © (18.09.03 02:51) [1]


Тогда ответь почему в таком программном коде:

case DataModule3.QueryBound.FieldDefs.Items[n].Name of
"NaimPred" : FGroup.ListBox1.Items.Add("Наименование предприятия");
"Primechanie" : FGroup.ListBox1.Items.Add("Дополнительно");
end;


При компиляции выдаются ошибки:
На первую строку - Ordinal type requiredА на остальные две - Incompatible types: "Integer" and "String"
????


 
Думкин ©   (2003-09-18 05:26) [3]

Ну и? Весь ответ в приведенных постах.


 
Tumcoat   (2003-09-18 06:26) [4]


> Думкин © (18.09.03 05:26)


Ага старый знакомый.
Ты вопрос внимательно прочитал, я как раз и спрашивал, как сделать так, чтобы все это заработало?
Моих знаний не хватает, чтоб справиться с этом проблемой.

ЗЫ: еще раз спасибо, за тот код, вчера попробовал, все заработало.


 
KSergey ©   (2003-09-18 07:24) [5]

>[2] Tumcoat (18.09.03 04:11)

Ну так действительно- все уже пояснили. В case требуется перечислимый тип. Тип string таковым не является.

В конфе потрепаться есть уроки Юрия Зотова - вам именно туда. Это относится и к case MyColor of - Юрий все это доходчиво объясняет. Для ищущих, конечно.


 
Tumcoat ©   (2003-09-18 07:40) [6]


> KSergey © (18.09.03 07:24)


Спасибо, посмотрю


 
Tumcoat ©   (2003-09-18 07:51) [7]

Посмотрел, ничего путного не нашел.
И вообще, вопрос был не почему не работает, а другой, можно ли сделать так чтоб заработала со string-ом.
Ну раз никто не хочет отвечать, (или никто не знает), вопрос снимаю.


 
Думкин ©   (2003-09-18 08:07) [8]

> Tumcoat © (18.09.03 07:51)
> Посмотрел, ничего путного не нашел.
> И вообще, вопрос был не почему не работает, а другой, можно
> ли сделать так чтоб заработала со string-ом.
> Ну раз никто не хочет отвечать, (или никто не знает),

Про не знает - ты осторожней. Два дня твой вопрос по Ворду висел, а решился за 10 минут. Тут опять также?

Не работает это напрямую со стрингом. Раз у тебя имена перечисляются в Кейс - значит их можно заиндексировать и поставить в соответствие перечислимый тип.

type
TMyCool = (pNaimPred,pPrimechanie);
var
MyCool : array [TMyCool] of string;
BB : TMyCool;

MyCool[pNaimPred] := "NaimPred";
MyCool[pPrimechanie] := Primechanie;

case BB of
pNamePred : FGroup.ListBox1.Items.Add("Наименование предприятия");
pPrimechanie : FGroup.ListBox1.Items.Add("Дополнительно");
end;



На вскидку - можно так, а можно иначе - чеши репу хоть иногда.


 
Tumcoat ©   (2003-09-18 08:18) [9]

Во приятно общаться с умным человеком. А насчет:


> Про не знает - ты осторожней. Два дня твой вопрос по Ворду
> висел, а решился за 10 минут. Тут опять также?


Вот именно: тут опядь же, вас пока не выматеришь (извиняюсь конечно) как следует, ответа не получишь. Но все равно спасибо.

ЗЫ: И по поводу репы. Эти вопросы у меня чай не 5 мин назад появились, по полгода маялся над решением. Если б смог бы сам найти к вам не приставал бы.


 
Hooch ©   (2003-09-18 08:19) [10]

я так со стрингом делаю

case AnsiTextIndex(Str,["NamePred","Primechanie"]) of
0 : FGroup.ListBox1.Items.Add("Наименование предприятия");
1 : FGroup.ListBox1.Items.Add("Дополнительно");
end;


 
Tumcoat ©   (2003-09-18 08:21) [11]


> Hooch ©

Спасибо.


 
Song ©   (2003-09-18 08:53) [12]

Да.. столько гемора чтобы использовать Case ?

IF (условие) then (действие) else
IF (условие) then (действие) else
IF (условие) then (действие) else и т.д.


С точки зрения компилятора такой код будет построен выгодней.


 
Tumcoat ©   (2003-09-18 09:19) [13]


> Song © (18.09.03 08:53)


Я как раз от if-a пытаюсь уйти, а ты меня опять к нему возвращаешь.


 
Tumcoat ©   (2003-09-18 09:20) [14]

И кстати, почему он будет выгодней?


 
pasha_676 ©   (2003-09-18 09:29) [15]


> И кстати, почему он будет выгодней?

Извини, но твои посты на редкость.... как бы это сказать.... выдают твою неграмотность.

В первом же посте тебе дают ответ, ты продолжаешь гнуть свое.
Почему выгодней тебе тоже объяснили - С точки зрения компилятора. Ты в курсе что есть компиляция, машинный код? Или до сих пор думаешь что "компьютер читает программу на Дельфи и делает как там написано".

Я кстати Song-а поддерживаю. Case стоит использовать только с перечисляемыми типами и то далеко не всегда.


 
KSergey ©   (2003-09-18 09:49) [16]

[13] Tumcoat © (18.09.03 09:19)
Я как раз от if-a пытаюсь уйти, а ты меня опять к нему возвращаешь.


А какой смысл от него уходить? Чем он не угодил?

Впрочем, вы бы за по-года просто книжечки почитали и все ;) Честное слово.


 
Tumcoat ©   (2003-09-18 10:15) [17]

Слышь, юмористы, я тоже посмеяться люблю.
Так что во-первых: я никогда и не гнул пальцы, что я там такой профи...
Как говориться, мы все учились понемногу чему-нибудь и как нибудь. Сами-то как давно прошли мою ступень грамотности? Или вы сразу родились с прошивкой в мозгах всех тонкостей Дельфи и программирования вообще.
Во-вторых: я спросил чем технически 20 if-ов выгоднее одного Case с 20-ю строками. Я всегда считал, что гораздо меньше времени и ресурсов затратиться при выполнении одного оператора, а не 20-ти. Так что вместо шуточек могли бы объяснить принцип действия case, раз по вашему я его не понимаю.
В-третьих: те книги которые у меня есть я уже прочитал, других нет, не так-то легко у нас найти хорошую книгу, да и финансы что-то не очень позволяют покупать все подряд, чтоб найти крупицу истины. Или вы думаете у меня за спиной целая библиотека в неск. тысяч томов?


 
Song ©   (2003-09-18 10:24) [18]

Дык а разница в чём? В if"ах будет 20 строчек на 20 сравнений, а в Case"е 20 строчек + 2 (если писать Case и End на отд. строчках). Ты мне скажи чем он тебе лучше?


 
Плохиш_   (2003-09-18 10:27) [19]

>Tumcoat © (18.09.03 10:15) [17]
Если только как нибудь

Кстати а F1 нажимать пробовал, там скрывается лучшая книга по делфи.


 
PVOzerski ©   (2003-09-18 10:34) [20]

Я тут по-быстрому эксперимент сделал. Правда, вместо Delphi взял FreePascal - из него удобно ASM-код генерить. Вот что делает оптимизатор этого компилятора. Исходный текст:

procedure op(x:longint);
begin
writeln(x);
end;
var
x:longint;
begin
readln(x);
case x of
0:op(1);
1:op(2);
2:op(3);
else
op(4);
end;
if x=0 then
op(1)
else if x=1 then
op(2)
else if x=2 then
op(3)
else
op(4);
end.

CASE в виде ASM:
mov eax,dword ptr [dword ptr U_PROGRAM_X]
test eax,eax
jl @@37
test eax,eax
je @@18
dec eax
jz @@20
dec eax
jz @@22
jmp @@37
@@22:
push 3
call _PROGRAM_OP$LONGINT
jmp @@36
@@20:
push 2
call _PROGRAM_OP$LONGINT
jmp @@36
@@18:
push 1
call _PROGRAM_OP$LONGINT
jmp @@36
@@37:
push 4
call _PROGRAM_OP$LONGINT
@@36:

IF"ы в виде ASM:
mov eax,dword ptr [dword ptr U_PROGRAM_X]
test eax,eax
je @@46
jmp @@47
@@46:
push 1
call _PROGRAM_OP$LONGINT
jmp @@50
@@47:
mov eax,dword ptr [dword ptr U_PROGRAM_X]
cmp eax,1
je @@51
jmp @@52
@@51:
push 2
call _PROGRAM_OP$LONGINT
jmp @@55
@@52:
mov eax,dword ptr [dword ptr U_PROGRAM_X]
cmp eax,2
je @@56
jmp @@57
@@56:
push 3
call _PROGRAM_OP$LONGINT
jmp @@60
@@57:
push 4
call _PROGRAM_OP$LONGINT
@@60:
@@55:
@@50:

Пожалуй, CASE оптимизирован с точки зрения скорости выполнения кода лучше, но длина ASM-кода довольно близкая, особенно если учесть фактическое совпадение @@60, @@55 и @@50. Конечно, оптимизация в Delphi может быть и не такой.


 
Плохиш_   (2003-09-18 10:38) [21]

> PVOzerski © (18.09.03 10:34) [20]

Попробуй так:

case x of
1:op(2);
0:op(1);
2:op(3);
else
op(4);
end;


 
PVOzerski ©   (2003-09-18 10:46) [22]

2 [21]: практически то же, что и в предыдущем примере с CASE:
mov eax,dword ptr [dword ptr U_PROGRAM_X]
test eax,eax
jl @@70
test eax,eax
je @@26
dec eax
jz @@24
dec eax
jz @@28
jmp @@70
@@28:
push 3
call _PROGRAM_OP$LONGINT
jmp @@69
@@26:
push 1
call _PROGRAM_OP$LONGINT
jmp @@69
@@24:
push 2
call _PROGRAM_OP$LONGINT
jmp @@69
@@70:
push 4
call _PROGRAM_OP$LONGINT
@@69:


 
app ©   (2003-09-18 11:48) [23]

Хочу с CASE это в данном случае религия.


 
Erik   (2003-09-18 12:57) [24]

Да ладно вам сам Borland рекомендует использовать Case а не if если это возможно. Case просто вычисляет куда надо перейти, а не сравнивает по крайней мере в Delphi.


 
Tumcoat ©   (2003-09-19 01:40) [25]


> Song © (18.09.03 10:24) [18]
> Дык а разница в чём? В if"ах будет 20 строчек на 20 сравнений,
> а в Case"е 20 строчек + 2 (если писать Case и End на отд.
> строчках). Ты мне скажи чем он тебе лучше?


Я говорил не о 20-ти строчках, а о 20-ти операторах, по-моему это не совсем одно и то же, хотя может я действительно чего не понимаю. Да и смотриться красивше :-)))), шутка.



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

Текущий архив: 2003.10.02;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.024 c
14-4063
usdl
2003-09-14 11:24
2003.10.02
ВСЕМ,кто пишет программы самостоятельно, предлагаю объединиться.


1-3870
s_g
2003-09-19 00:40
2003.10.02
Как для консольного приложения поместить иконку в Tray?


6-4017
ilka
2003-08-06 15:35
2003.10.02
не могу разобраться с IdSmtp


3-3709
Фагот
2003-09-14 12:07
2003.10.02
Транзакции


14-4043
саша2
2003-09-16 10:11
2003.10.02
где форум?