Типы данных для констант Const и Enum

Предыдущая тема Следующая тема Перейти вниз

Типы данных для констант Const и Enum

Сообщение  Hemulo в Вс Янв 11, 2015 4:37 pm

Здравствуйте.

Я наткунулся на одну проблемму, решение которой пока не нашёл.

В FreeBASIC как и в других языках программирования константы имеют определённый тип.


Например:
Код:

Const A1 = 123     '  - имеет тип Integer
Const A2 = 1.23    '  - имеет тип Double
Const A3 = "123"   '  - имеет тип String

При задании констант можно явно указывать их тип.

Синтаксиc:  
Код:

Const symbolname [AS DataType] = value [, ...]

Например:
Код:

Const A1 As UByte = 123 ' - имеет тип UByte

Часто бывает необходимо создать свой тип данных с помощью Enum, в котором перечислялись бы возможные значения.
Синтаксис:
Код:

Enum [typename [ Explicit ] ]
    symbolname [= expression] [, ...]
    ...
End Enum

Проблема в том, что для тех констант, которые задаются через Enum нельзя (или я не нашёл как) явно задавать тип.

Когда это может понадобиться? Например при присвоении созданных пользователем перечисляемых типов с комбинацией Enum и Type.
Как пример:
Код:

Enum Numeroj
    Nulo =0
    Unu =1
    Du   =2
End Enum

Type Mtype
    As Numeroj M1 =Unu
    As Numeroj M2 =Du
End Type

Dim  Matrix(1000000) As Mtype

В данном случае, может быть весьма важно каков размер элемента массива (особенно, если ещё записывать в файл или читать из файла).
Увы, по умолчанию, элементы M1 и M2 заданные с перечисляемым типом Numeroj автоматически имеют тип Integer, что в зависимости от используемой битности соответствует x32 - 4 байта, x64 - 8 байт.

Вопрос в том, каким образом можно было бы задать размерность констант для Enum.

Я пробовал два способа, которые мне никак не помогли.

Первоый способ: Попробовать явно определить размерность константы, а потом задать  с помощью этой константы значение элемента Enum.
Задание размерности через размерность константы работает например с переменными заданными через Var.

Код:

Const As UByte ConstNulo  = 0

Var TestVar    = ConstNulo

Enum TestEnum
    TestNulo     = ConstNulo
End Enum

Здесь переменная TestVar получает тип Ubyte
А размерность TestNulo - всё равно остаётся Integer

Второй способ, который я пробовал - это явное преобразование типа с помощью Cast
Пример:
Код:

Const  As UInteger ConstNulo = 0 '  Задание константы с типом UInteger
 
Var TestVar = Cast (UByte,ConstNulo) '  Явное преобразование типа из UInteger в UByte
 
Enum TestEnum
    TestNulo     =  Cast (UByte,ConstNulo)
End Enum

В данном случае, переменная, задаваемая с помощью Var принимает размерность UByte, А элемент перечисляемого списка TestNulo сохраняет свою размерность Integer.

На данный момент, я вероятней всего, откажусь от использования Enum в пользу простых констант, но это не очень удобно.

Подскажите, пожалуйста, вдруг я что-то упустил.

Я хотел задать этот вопрос на форуме разработчиков FreeBASIC, но боюсь, что не смогу развёрнуто описать проблему на английском языке.

PS: Размерность я определял с помощью Sizeof

PPS: Кстати, Создать массив в миллион элементов с размерностью в байт с помощью обычного Dim у меня получилось, а вот создать массив в миллион элементов Integer (у меня 8 байт) с помощью Dim уже невозможно из-за переполнения стека (который имеет ораниченный размер).

Это я к тому, что размерность элемента может быть весьма важна.

Hemulo

Сообщения : 2
Дата регистрации : 2012-01-05

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Типы данных для констант Const и Enum

Сообщение  Замабувараев в Пн Янв 12, 2015 4:05 am

Указать тип для перечислений нельзя. Такую фишку поддерживает только vb.net.
А под стэк по умолчанию отводится один мегабайт, поэтому при создании массива в миллион Integer происходит переполнение.
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 33
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Re: Типы данных для констант Const и Enum

Сообщение  Hemulo в Ср Янв 14, 2015 12:20 am

zamabuvaraeu пишет:Указать тип для перечислений нельзя. Такую фишку поддерживает только vb.net..

Да, я уже понял. Нашёл описание этого же вопроса на сишном форуме.

Тип для Enum стандартом не определяется и зависит только от конкретной реализации компилятора.

Ладно. Не знал, буду иметь в виду.

Hemulo

Сообщения : 2
Дата регистрации : 2012-01-05

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Типы данных для констант Const и Enum

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения