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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2014, 16:22   #1
exyl
Пользователь
 
Регистрация: 15.11.2014
Сообщений: 75
По умолчанию case of и массив-константа

Здрассьте.
case of - удобная штука, однако столкнулся с небольшой проблемкой. В этом операторе можно использовать только значения-константы. Ок, объявляю:
Код:
const LC : array [0..18] of byte = (8, 9, 10, 11, 55, 57, 70, 75, 90, 91, 92, 93, 100, 109, 130, 140, 155, 170, 171);
Пытаюсь использовать:
Код:
  case T.Tag of
    LC[0]  : Panel1.Visible:=true;
  end;
Выдает ошибку:
Цитата:
[DCC Error] ZZZ.pas(12346): E2026 Constant expression expected
Но ведь этот массив и все его значения предопределены с самого начала, в чем проблема?
При этом, если сделать отдельные константы для каждого значения в массиве, то, естессно, работает.
Почему мне хотелось бы использовать именно так - у меня часто встречаются case of, в которых используются именно эти значения. Но значения могут поменяться и не хотелось бы искать по всем модулям и менять вручную или заводить 19 отдельных констант или использовать кучу конструкций if...then (хотя именно этот вариант пока выглядит наиболее оправданно). Что посоветуете?
exyl вне форума Ответить с цитированием
Старый 01.12.2014, 16:33   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Но ведь этот массив и все его значения предопределены с самого начала, в чем проблема?
сущности, объявленные похожим образом:
Код:
const LC : array [0..18] of byte = (8, 9, 10, 11, 55, 57, 70, 75, 90, 91, 92, 93, 100, 109, 130, 140, 155, 170, 171);
Не являются константами на самом деле. Это переменные, у которых уже имеются значения. Это не константы.
Вадим Мошев вне форума Ответить с цитированием
Старый 01.12.2014, 16:48   #3
exyl
Пользователь
 
Регистрация: 15.11.2014
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
сущности, объявленные похожим образом:
Код:
const LC : array [0..18] of byte = (8, 9, 10, 11, 55, 57, 70, 75, 90, 91, 92, 93, 100, 109, 130, 140, 155, 170, 171);
Не являются константами на самом деле. Это переменные, у которых уже имеются значения. Это не константы.
Если это не константы, то могу ли я присвоить новое значение в массиве:
Код:
LC[0]:=1;
Нет, выдает ошибку. Тогда каким образом можно выявить "переменность" это переменной? Я не спорю с твоим утверждением, просто интерес.

Самое главное для меня - что лучше/правильнее/удобнее/логичнее использовать? Массив и кучу конструкций if...then?
exyl вне форума Ответить с цитированием
Старый 01.12.2014, 16:52   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

заводи в одном юните:

Const MyValueA = 8;
MyValueB = 9;
и т.д.

В остальных юнитах в uses ссылка на этот юнит. Значения констант тогда менять только в одном месте. и

case тра-ля-ля of
MyValueA: ...
MyValueB: ...
end;

Можно и массив с этих констант организовать, но не для case
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 01.12.2014 в 16:54.
Аватар вне форума Ответить с цитированием
Старый 01.12.2014, 17:12   #5
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Для case можно энумерейт завести:
Код:
        TMyEnum = (
                            tmeMyNoneFlag        = 0
                          , tmeMyReadOnlyFlag  = 1 shl 0
                          , tmeMyHiddenFlag     = 1 shl 1
                         );
Его потом точно так же как и массив можно и перебирать, если требуется:
Код:
 for e := Low(TMyEnum) to High(TMyEnum)
И никаких magic number - всё поголовье именное @_@
StriderX вне форума Ответить с цитированием
Старый 01.12.2014, 17:13   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Для case можно энумерейт завести
Конечно это удобней, но значения констант ТС не вписываются в такой тип.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.12.2014, 17:15   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Цитата:
Нет, выдает ошибку. Тогда каким образом можно выявить "переменность" это переменной? Я не спорю с твоим утверждением, просто интерес.
Констант не существует. Константа это переменная, в область памяти которой запрещена запись. В старых дельфях, для модуля, можно было включить WRITABLE_CONSTS, разрешающую запись в константы.
Человек_Борща вне форума Ответить с цитированием
Старый 01.12.2014, 17:23   #8
exyl
Пользователь
 
Регистрация: 15.11.2014
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
заводи в одном юните:
Да по идеологии того, кто начинал этот проект, все глобальные переменные, а так же константы, типы и общие функции работы с типами и так находятся в отдельном юните, который прописан во всех юнитах форм (в "бестелесных" юнитах он не прописан и значения глобальных переменных передаются туда только в виде параметров функций или процедур).

Цитата:
И никаких magic number - всё поголовье именное
Вообще те данные, что я привел - это некая кривая (curve), описывающее движение и именных констант внутри как бы и не требуется, т.к. она отрабатывает либо наполовину, либо полностью и нужны только индексы.

Цитата:
Константа это переменная, в область памяти которой запрещена запись.
А почему тогда при невозможности записать:
Код:
LC[0]:=1;
Тем не менее case of не работает?

Последний раз редактировалось exyl; 01.12.2014 в 17:25.
exyl вне форума Ответить с цитированием
Старый 01.12.2014, 17:26   #9
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Конечно это удобней, но значения констант ТС не вписываются в такой тип.
Непонятно почему не вписываются (может версия делфи не та, запросто). Ну а ежели даже хочется от нуля и по порядку, заводим мы:
Код:
        TMyEnum = (
                            tmeMyNoneFlag        = 0
                          , tmeMyReadOnlyFlag  = 1
                          , tmeMyHiddenFlag     = 2
                         );
Пропишем ниже переменную
Код:
 myconstholder : array[TMyEnum] of string = ('none', 'ronly', 'hidden');
И даже не хотим себе потенциальную мину создавать, влепим функцию инициализации где явно и запишем:
Код:
 myconstholder[tmeMyNoneFlag] = 'hello, world';
В этом смысле то можно под себя выстроить что угодно, нипанятна...
StriderX вне форума Ответить с цитированием
Старый 01.12.2014, 17:27   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
но значения констант ТС не вписываются в такой тип
По поводу #6 - перенклинило, так можно
Код:
TMyEnum = (
                            tmeMyNoneFlag        = 1
                          , tmeMyReadOnlyFlag  = 3
                          , tmeMyHiddenFlag     = 9
                         );
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Константа Михаил Юрьевич Общие вопросы Delphi 2 16.11.2014 22:47
Динамическая константа deduschka PHP 5 20.11.2013 23:28
abc типизированная константа массив wkololo Паскаль, Turbo Pascal, PascalABC.NET 0 22.05.2011 21:09
Константа ideasforlife Общие вопросы C/C++ 6 09.05.2011 16:06
многомерный не квадартный массив-константа Izhic Общие вопросы Delphi 3 11.11.2009 16:34