Типы данных для констант Const и Enum
Участников: 2
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Типы данных для констант Const и Enum
Здравствуйте.
Я наткунулся на одну проблемму, решение которой пока не нашёл.
В FreeBASIC как и в других языках программирования константы имеют определённый тип.
Например:
При задании констант можно явно указывать их тип.
Синтаксиc:
Например:
Часто бывает необходимо создать свой тип данных с помощью Enum, в котором перечислялись бы возможные значения.
Синтаксис:
Проблема в том, что для тех констант, которые задаются через Enum нельзя (или я не нашёл как) явно задавать тип.
Когда это может понадобиться? Например при присвоении созданных пользователем перечисляемых типов с комбинацией Enum и Type.
Как пример:
В данном случае, может быть весьма важно каков размер элемента массива (особенно, если ещё записывать в файл или читать из файла).
Увы, по умолчанию, элементы M1 и M2 заданные с перечисляемым типом Numeroj автоматически имеют тип Integer, что в зависимости от используемой битности соответствует x32 - 4 байта, x64 - 8 байт.
Вопрос в том, каким образом можно было бы задать размерность констант для Enum.
Я пробовал два способа, которые мне никак не помогли.
Первоый способ: Попробовать явно определить размерность константы, а потом задать с помощью этой константы значение элемента Enum.
Задание размерности через размерность константы работает например с переменными заданными через Var.
Здесь переменная TestVar получает тип Ubyte
А размерность TestNulo - всё равно остаётся Integer
Второй способ, который я пробовал - это явное преобразование типа с помощью Cast
Пример:
В данном случае, переменная, задаваемая с помощью Var принимает размерность UByte, А элемент перечисляемого списка TestNulo сохраняет свою размерность Integer.
На данный момент, я вероятней всего, откажусь от использования Enum в пользу простых констант, но это не очень удобно.
Подскажите, пожалуйста, вдруг я что-то упустил.
Я хотел задать этот вопрос на форуме разработчиков FreeBASIC, но боюсь, что не смогу развёрнуто описать проблему на английском языке.
PS: Размерность я определял с помощью Sizeof
PPS: Кстати, Создать массив в миллион элементов с размерностью в байт с помощью обычного Dim у меня получилось, а вот создать массив в миллион элементов Integer (у меня 8 байт) с помощью Dim уже невозможно из-за переполнения стека (который имеет ораниченный размер).
Это я к тому, что размерность элемента может быть весьма важна.
Я наткунулся на одну проблемму, решение которой пока не нашёл.
В 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
Указать тип для перечислений нельзя. Такую фишку поддерживает только vb.net.
А под стэк по умолчанию отводится один мегабайт, поэтому при создании массива в миллион Integer происходит переполнение.
А под стэк по умолчанию отводится один мегабайт, поэтому при создании массива в миллион Integer происходит переполнение.
Re: Типы данных для констант Const и Enum
zamabuvaraeu пишет:Указать тип для перечислений нельзя. Такую фишку поддерживает только vb.net..
Да, я уже понял. Нашёл описание этого же вопроса на сишном форуме.
Тип для Enum стандартом не определяется и зависит только от конкретной реализации компилятора.
Ладно. Не знал, буду иметь в виду.
Hemulo- Сообщения : 2
Дата регистрации : 2012-01-05
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|