11 / 8 / 3
Регистрация: 14.07.2015
Сообщений: 284
1

Почему case работает только с выражениями, и не работает с функциями?

30.03.2016, 19:14. Показов 1419. Ответов 12
Метки case (Все метки)

Author24 — интернет-сервис помощи студентам
и как быть например если хочу действовоть в зависимоти от результатов вызова функции

Delphi
1
2
3
4
case MyFunc(i) of
3: ...;
4: ...;
default; end;
или я ошибаюсь? Неужели по любому использовать if-ы?

и не работает с перемеными и не работает с "+" "-"
Delphi
1
case i + j of...
или
Delphi
1
case i of 3: ...;
не работает

Добавлено через 42 секунды
каковы альтернативы?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.03.2016, 19:14
Ответы с готовыми решениями:

Ноутбук работает только с Wi Fi роутера дома, в кафе не работает и везде. Почему?
Подскажите пожалуйста, почему у меня ноутбук с виндой 7, работает вай фай только дома с роутера. А...

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

Почему не работает case?
<canvas id="myCanvas" width="500" height="500"> <script> var c =...

Почему case не работает со строками?
const d = 'postbutton'; r = 'badbutton'; var s: string; sf: string; begin sf := Button1.name;...

12
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32986 / 21294 / 8178
Регистрация: 22.10.2011
Сообщений: 36,583
Записей в блоге: 8
30.03.2016, 19:18 2
Чего это "не работает"? Нормально все работает:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function MyFunc(i : integer) : integer;
begin
  result := i;
end;
 
procedure TForm1.Button9Click(Sender: TObject);
var i : integer;
begin
  i := StrToInt(Edit1.Text);
  case MyFunc(i) of
  1: ShowMessage('one');
  2: ShowMessage('two');
  else
    ShowMessage('error')
  end;
end;
Добавлено через 1 минуту
Цитата Сообщение от ПраПрапорщик Посмотреть сообщение
и не работает с перемеными
и с переменными работает. И с выражениями. Больше кода показывай. По огрызкам, которые ты приводишь, ничего не понять.
1
Хитрая блондиночка $)
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
30.03.2016, 19:19 3
Case работает не с функцией, а с ее результатом.
Если она возвращает значение ординального типа - проблем не будет.
С неординалом этот оператор не работает.
Ординалы: Целое, Логическое, Символ, Перечислимый тип.
Другие типы с Case не будут работать.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32986 / 21294 / 8178
Регистрация: 22.10.2011
Сообщений: 36,583
Записей в блоге: 8
30.03.2016, 19:22 4
Цитата Сообщение от Hikari Посмотреть сообщение
С неординалом этот оператор не работает.
Бла-бла-бла. String - это неординал. Прекрасно Case со строковыми константами работает. У тебя познания из последней четверти прошлого века.
1
11 / 8 / 3
Регистрация: 14.07.2015
Сообщений: 284
30.03.2016, 19:25  [ТС] 5
да я не правильно выразился
Delphi
1
2
3
4
5
var j: integer = 3;
...
case i of
j: ShowMessage('3');
4: ShowMessage('4');
не работает а
Delphi
1
2
3
4
5
var j: integer = 3;
...
case i of
3: ShowMessage('3');
4: ShowMessage('4');
работает
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32986 / 21294 / 8178
Регистрация: 22.10.2011
Сообщений: 36,583
Записей в блоге: 8
30.03.2016, 19:29 6
Лучший ответ Сообщение было отмечено ПраПрапорщик как решение

Решение

Цитата Сообщение от ПраПрапорщик Посмотреть сообщение
не работает
Вот тут я с компилятором согласен полностью. Все метки, на которые может осуществиться переход, должны быть известны на этапе компиляции, так что там могут быть только константы. Если значения станут известны только в рантайме - прямая дорога к использованию if.
1
0 / 0 / 0
Регистрация: 27.03.2016
Сообщений: 37
30.03.2016, 19:53 7
Не знаю про что вы, но все равно напишу

Не по теме:

Про это ли я подумал


Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.Button1Click(Sender: TObject);
  begin
    case ComboBox1.ItemIndex of
      0:
      begin
        ShowMessage('0');
      end;  
      1:
      begin
        ShowMessage('1');
    end;
  end;
0
11 / 8 / 3
Регистрация: 14.07.2015
Сообщений: 284
30.03.2016, 20:38  [ТС] 8
Цитата Сообщение от volvo Посмотреть сообщение
только константы
пробовал не прокатывает
Delphi
1
2
3
4
5
6
7
8
const Klpdw: DWORD = 6366191;
...
var kb: DWORD;
...
kb := MyFunc;
case kb of
Klpdw: ...;// так не работает, вывзвает ошибку Constant Expression expected
6366191: ...;// а так работает
Lazarus версия 1.4.0. Может проблема в DWORD?

Цитата Сообщение от Hitler Посмотреть сообщение
но все равно напишу
и? Ошибку выдает?

Добавлено через 37 минут
volvo, более того
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const
i1 = 3;
i2: integer = 3;
s1 = 'stroka';
s2: string = 'stroka';
...
 
case i of
i1: ...; // работает
i2: ...; // не работает, выдает Constant expression expected
 
case s of
s1: ...; // работает
s2: ...; // не работает выдает Constant and CASE types do not match
Добавлено через 36 секунд
В чем разница между записями i1 = 3 и i2: integer = 3;?

Добавлено через 2 минуты
Это читал не объясняют
0
Хитрая блондиночка $)
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
30.03.2016, 21:05 9
Цитата Сообщение от ПраПрапорщик Посмотреть сообщение
В чем разница между записями i1 = 3 и i2: integer = 3;?
http://www.borlpasc.narod.ru/refer/2/tipiz.htm
Грубо говоря:
i1 = 3; - Это чистая константа, и может быть использована в выборе Case, ибо вычисляется на этапе компиляции
i2: integer = 3; - Это переменная, и на этапе компиляции ее значение считается неопределенным, хоть и заданным изначально. Т.е. эта форма может быть изменена в ходе работы программы, а изменяемые значения в Case подставляться не могут.

Вообще зачем тебе Case понадобился? Почему именно его?
2
11 / 8 / 3
Регистрация: 14.07.2015
Сообщений: 284
30.03.2016, 21:18  [ТС] 10
Цитата Сообщение от Hikari Посмотреть сообщение
Вообще зачем тебе Case понадобился? Почему именно его?
А что еще? У меня два числа DWORD означающих русскую и англ раскладки:
68748313 и 67699721.
Если я объявлю их вначале программы как константы RU и EN, мне легче писать
Delphi
1
2
3
4
kb := GetCurrentKbrd;
case kb of
RU: ...;
EN: ...;
чем
Delphi
1
2
3
4
kb := GetCurrentKbrd;
case kb of
68748313: ...;
67699721: ...;
Добавлено через 48 секунд
Ладно если это надо испольщовать один раз. но каждый раз вспоминать эти числа или идти вверх и копировать
0
0 / 0 / 0
Регистрация: 27.03.2016
Сообщений: 37
30.03.2016, 21:21 11
Цитата Сообщение от ПраПрапорщик Посмотреть сообщение
пробовал не прокатывает
Delphi
1
2
3
4
5
6
7
8
const Klpdw: DWORD = 6366191;
...
var kb: DWORD;
...
kb := MyFunc;
case kb of
Klpdw: ...;// так не работает, вывзвает ошибку Constant Expression expected
6366191: ...;// а так работает
Lazarus версия 1.4.0. Может проблема в DWORD?


и? Ошибку выдает?

Добавлено через 37 минут
volvo, более того
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const
i1 = 3;
i2: integer = 3;
s1 = 'stroka';
s2: string = 'stroka';
...
 
case i of
i1: ...; // работает
i2: ...; // не работает, выдает Constant expression expected
 
case s of
s1: ...; // работает
s2: ...; // не работает выдает Constant and CASE types do not match
Добавлено через 36 секунд
В чем разница между записями i1 = 3 и i2: integer = 3;?

Добавлено через 2 минуты
Это читал не объясняют
Нет ошибку не выдает, но мне кажется это не то что вам нужно
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32986 / 21294 / 8178
Регистрация: 22.10.2011
Сообщений: 36,583
Записей в блоге: 8
30.03.2016, 21:26 12
Цитата Сообщение от ПраПрапорщик Посмотреть сообщение
но каждый раз вспоминать эти числа или идти вверх и копировать
Вот посмотри на те же самые числа, но записанные в hex-е:
$04090409;
$04190419;

Как ты думаешь, что проще запомнить, 68748313 или $04190419?
1
Хитрая блондиночка $)
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
30.03.2016, 21:27 13
Цитата Сообщение от ПраПрапорщик Посмотреть сообщение
Если я объявлю их вначале программы как константы RU и EN, мне легче писать
Тогда конечно полностью оправдано. Но если это чистые константы, а не гибрид полуконстанты-полупеременной.
Не типизируй их тогда. Просто присвой значение.
0
30.03.2016, 21:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2016, 21:27
Помогаю со студенческими работами здесь

почему не работает case? где ошибка?
uses SysUtils, ConvertRus; var day: integer; month: integer; year: integer; ...

Почему внутри case не работает такой код?
Подскажите, пожалуйста, почему внутри кейса не работает такой код? string a; cout<<"Введите...

Разве select case работает только с целыми числами?
Делаю пример по использоанию select case program XYZ1 implicit none integer :: A, B, C ...

Почему не работает sqrt? Подскажите, где ошибка? Простенькая программа с тремя функциями
#include "stdio.h" #include <math.h> #include "stdafx.h" double rekur(int k) { if(k==0)return...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru