Константы или перечисления

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Константы или перечисления

Сообщение Diamock » 15.02.2011 (Вт) 18:21

Здравствуйте Уважаемые!
В API-функциях, константы используются, как заначения одного из параметров функции.
Пример 1:
Код: Выделить всё
Private Const DC_ACTIVE As Long = &H1
'Функция использует цвета, обозначающие активный заголовок
Private Const DC_GRADIENT As Long = &H20                 
'Выводится градиентный заголовок
Private Const DC_ICON As Long = &H4
'Выводится иконка при отрисовке текста заголовка
Private Const DC_INBUTTON As Long = &H10
'Функция выводит заголовок как кнопку
Private Const DC_SMALLCAP As Long = &H2
'Выводит маленький заголовок, используя текущий маленький шрифт заголовка
Private Const DC_TEXT As Long = &H8
'Выводи текст заголовка при рисовании заголовка

Private Declare Function DrawCaption _
            Lib "user32.dll" ( _
            ByVal hWnd As Long, _
            ByVal hDC As Long, _
            ByRef pcRect As Rect, _
            ByVal uFlags As Long _
            ) As Long

Указанные константы из фрагмента кода, используются, как значения параметра uFlag
Будет ли правильным, немного переделать?
Пример 2:
Код: Выделить всё
Private Enum DC_uFlag
            DC_ACTIVE = &H1
            DC_GRADIENT = &H20
            DC_ICON = &H4
            DC_INBUTTON = &H10
            DC_SMALLCAP = &H2
            DC_TEXT = &H8
End Enum

Private Declare Function DrawCaption _
            Lib "user32.dll" ( _
            ByVal hWnd As Long, _
            ByVal hDC As Long, _
            ByRef pcRect As Rect, _
            ByVal uFlags As DC_uFlag _
            ) As Long

С одной стороны, очень удобно, с другой - отступление от официальной документации...
In der Beschrankung zeigt sich erst der Meister
Графоманю...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Константы или перечисления

Сообщение alibek » 15.02.2011 (Вт) 18:35

Нет никакой разницы между константами Long и перечислениями.
Lasciate ogni speranza, voi ch'entrate.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Константы или перечисления

Сообщение Twister » 15.02.2011 (Вт) 18:37

Константы - ничто иное, как символьные обозначения некой постоянной величины. Числовой, строковой... не имеет значения. Для удобства практически во всех языках принято декларировать их через const или подобные инструкции. Но если обозначить их как-то по другому, то на работу функций, использующих эти константы, это ни коим образом не повлияет. Другое дело, что сторонний разработчик, столкнувшись с таким кодом, может не сразу понять в чём дело.
А я все практикую лечение травами...

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Константы или перечисления

Сообщение Vi » 15.02.2011 (Вт) 18:42

Diamock писал(а):В API-функциях, константы используются, как значения одного из параметров функции...
Будет ли правильным, немного переделать?..
С одной стороны, очень удобно, с другой - отступление от официальной документации...

Попробовал? Работает? Самодокументирует? Помогает при программировании с подсказками? так пользуйся!

Такое отступление кругом и повсеместно - параметры трактуются так, как наиболее выгодно и наглядно. Иногда одна и та же функция используется с разными Алиасами, чтобы различать параметры (уйти от Any). Пример, VarPtr c ObjPtr и StrPtr или CopyMemory Ака RtlMoveMemory здесь на сайте. Главное - понимать, что делаешь.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Константы или перечисления

Сообщение Хакер » 15.02.2011 (Вт) 21:18

Twister писал(а):Для удобства практически во всех языках принято декларировать их через const или подобные инструкции.

Но надо понимать, что const в VB и const, например, в Си — это вообще разные вещи.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Константы или перечисления

Сообщение Vi » 16.02.2011 (Ср) 10:00

Хакер писал(а):Но надо понимать, что const в VB и const, например, в Си — это вообще разные вещи.

Заинтриговал. Почему разные? ИМХО, и там и там это константа. Что-то есть подводное и неочевидное?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Константы или перечисления

Сообщение Хакер » 16.02.2011 (Ср) 10:32

В VB константа — это особый тип языковой сущности. Есть переменные, а есть константы — и это совершенно разные вещи. В VB это способ некоторое значение пометить именем, чтобы везде в дальнейшем использовать имя вместо самого значения.

В C констант таких как в VB нет вообще. Наиболее близкой к VB заменой являются макроподстановки препроцессора (с помощью #define), но препроцессинг не имеет отношения к самому языку, это просто обработка текста без вникания в его смысл.

А const является просто квалификатором типа выражения/переменной, которое запрещает (на уровне компилятора) присваивать значение переменной, но переменная остаётся переменной. Особенно стоит подумать о сочетании квалификаторов const и volatile, обозначающее, что переменную не может менять данный код, но она может быть в любой момент изменена каким-то сторонним кодом.

Поэтому, во-первых, модификатор const может участвовать в аргументах (чего в VB и близко нет) функций.
Поэтому, во-вторых, возможны вещи вроде:
  • const int * a (указатель на int, значение которого нельзя менять),
  • int * const a (указатель, значение которого нельзя менять, на int, значение которого менять можно) и
  • const int * const a (указатель, значение которого нельзя менять, на int, значение которого нельзя менять).

Есть несколько следствий такого положения дел:
  • В VB константа не является переменной, поэтому ей даже нельзя попытаться присвоить новое значение: это будет синтаксические неверно. В Си же константа является просто read-only-для-кода переменной. Ей не получится просто так присвоить значение, но уже не из-за синтаксической неверности, а из-за несоответствия типа. Можно снять с переменной const-квалификатор и спокойно присвоить значение. Но в некоторых случаях это вызовет runtime ошибку.
  • Поскольку в Си константа является переменной (хоть и read-only), она занимает своё законное место секции данных или в стековом фрейме процедуры. Применение к ней оператор & (оператора увеличения уровня индирекции) будет всегда давать идентичное значение указателя.
    В VB константы не являются переменными, поэтому в стеке оказаться не могут принципиально никак, а объявление внутри процедуры просто делает идентификатор констаниты процедуро-локальным. Глобальные и локальные константы не помещаются в секцию данных (кроме значений строковых констант). Поэтому у константы нет определённого «адреса». Значение числовых констант вшиваются прямо в код (прямо в инструкции). Если нужно передать константу как значение ByRef-аргумента, всё делается так же, как с Implicit-константами: на стеке создаётся временная копия константы и в качестве реального значения ByRef-аргумента передаётся адрес этой копии. Поэтому, внутри процедуры, имеющей ByRef-параметр, можно попытаться изменить значение переданной by reference константы. Изменится, правда, при этом значение временной копии константы, лежащей на стеке. В Си, если константы локальная (внутрипроцедурная), если снять с неё const-квалификатор и проделать аналогичный трюк с функцией-ченджером, значение константы константной переменной изменится! А применение оператор & к Implicit-константе не допускается языком: никакой копии значения на стеке ради того, чтобы оператору & было какой адрес вернуть, создаваться не будет.
.

Оговорка: большинство компиляторов С/С++ для переменных с const-квалификатором, но без volatile-квалификатора генерируют такой код, словно это не переменные, а VB-style-константы. Но это оптимизация, а не свойства сущностей в языке. То есть, почему это не имеет прямого отношения к const — потому что компилятор сделает такую оптимизацию даже если не снабдить переменную const-квалификатором.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Константы или перечисления

Сообщение Diamock » 16.02.2011 (Ср) 12:27

Очень интересно и познавательно! Большое спасибо за разъяснение!
In der Beschrankung zeigt sich erst der Meister
Графоманю...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Константы или перечисления

Сообщение Mikle » 16.02.2011 (Ср) 14:49

Хакер
Действительно познавательно, особенно про константные\неконстантные указатели на константные\неконстантные значения. А что тогда представляет из себя enum в C++? Не именованный набор vb-style констант?


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Mail.ru [бот] и гости: 50

    TopList