Форум: "Основная";
Текущий архив: 2003.10.02;
Скачать: [xml.tar.bz2];
ВнизРабота с 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.01 c