Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-3825
JohnJ
2003-09-18 10:52
2003.10.02
жирный шрифт некоторых букв в memo


1-3864
3APA3A
2003-09-19 03:50
2003.10.02
Меню как в Delphi7


3-3803
Peps
2003-09-11 06:27
2003.10.02
Работа с DBComboBox


14-4049
gaval
2003-09-16 09:57
2003.10.02
Взлом игры


1-3937
Sergiy
2003-09-21 13:45
2003.10.02
Блокировка перевода времени





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский