Декларирует переменную
Синтаксис
Декларирование одной переменной:
Декларирование массивов:
Dim [Shared] symbolname ( [lbound To] ubound [, ...] ) [As DataType] [,...]
Dim [Shared] As DataType symbolname ( [lbound To] ubound [, ...] ) [,...]
Инициализация значений:
Dim scalar_symbol As DataType] = expression | Any
Dim array_symbol ([lbound To] ubound) [AS DataType] => { expression [, ...] } | Any
Dim udt_symbol As DataType = ( expression [, ...] ) | Any
Описание
Декларирует переменную по имени и резервирует память для размещения.
Переменные должны быть объявлены до того, как они могут быть использованы,
в диалекте
-lang fb или при
использовании
Option Explicit
в других диалектах. Только в диалектах
-lang qb
и
-lang fblite переменные могут
быть использованы без предварительного объявления их, в таком случае они
называются неявными переменными.
Dim может использоваться для объявления и присвоения переменных
любого из поддерживаемых типов данных, определяемых пользователем типов или
перечисления.
В зависимости от того, где и как переменная или массив объявляется ,можно
изменить то, как он выделяется в памяти. Смотрите
Классы хранения.
Явные переменные с явными типами данных
В диалекте по умолчанию
-lang fb,
каждая переменная должна быть объявлена явно с желаемым типом данных.
Суффиксы для типов не допускаются.
Более одной переменной могут быть объявлены в одном заявлении
Dim
, разделяя объявления переменных запятыми.
'' Примеры деклараций переменных
'' Одна переменная за один вызов DIM
Dim text As String
Dim x As Double
'' Более чем одна переменная в одном заявлении
DIM, с различными типами данных
Dim k As Single, factor As Double, s As String
'' Более чем одна переменная в одном заявлении
DIM, с одинаковыми типами данных
Dim As Integer mx, my, mz ,mb
'' Переменная имеет инициализатор
Dim px As Double Ptr = @x
Явные переменные с неявными типами данных
В диалектах
-lang qb и
-lang fblite ,
даже если переменная объявлена явно, ей будет дан тип данных по умолчанию,
если тип данных не задан явно по имени, либо по суффиксу типа. Типом данных
по умолчанию является
Single в
диалекте
-lang qb и
Integer
в диалекте
-lang fblite. Тип
данных по умолчанию может быть изменен в течение всего исходника с
использованием заявлений
Def###. (для примера,
DefInt,
DefStr,
DefSng)
'' Компилировать с -lang qb
'$lang: "qb"
'' Все переменные, начинающиеся с A по N по умолчанию
будут иметь тип данных INTEGER
'' Все остальные переменные по умолчанию будут иметь
тип данных SINGLE
DefInt I-N
'' I и J являются INTEGER
'' X и Y являются SINGLE
'' T$ является STRING
'' D является DOUBLE
Dim I, J, X, Y, T$, D As Double
Массивы
Как и в большинстве
BASIC диалектов, FreeBASIC
поддерживает массивы с индексами от нижней границы до верхней границы. В
синтаксисе,
lbound относится к нижней границе, или
наименьшим индексом. А
Ubound относится к верхней границе,
или наибольший индекс. Если нижняя граница не указана, то она считается по
умолчанию равной нулю, если
Option Base
не используется.
Const upperbound = 10
'' Объявляет массив с индексами от 0 до UpperBound,
'' в общей сложности с кол-вом индексов (upperbound + 1).
Dim array(upperbound) As Single
Многомерные массивы также могут быть объявлены. Они хранятся в определенном
порядке: значения, отличающиеся только последним индексом являются смежными (row-major
порядок).
Максимальное количество размерностей многомерного массива - 8.
'' объявить трехмерный массив single
'' с точностью чисел с плавающей запятой.
Dim array(1 To 2, 6, 3 To 5) As Single
'' Первое измерение массива
'' имеет индексы от 1 до 2, второе от 0 до 6,
'' а третье от 3 до 5.
Дополнительные сведения о массивах см.
Общие
сведения о массивах.
Если значения используемые с
Dim при объявлении размера
массива являются константами, будет создан массив
Static
(Если не указано
Option Dynamic).
Однако если это делается с помощью одной или нескольких переменных, то это
сделает массив переменной длины, даже если
Option Static
имеет эффект.
Массивы переменной длины могут быть объявлены несколькими способами:
Используя
Dim с пустым набором индексов (
Dim x()),
используя
Dim с индексами, которые являются переменными или
с помощью ключевого слова
ReDim, или
объявив его после метакоманды
$Dynamic.
Массивы переменной длины не могут использовать инициализаторы.
Массивы , объявляемые с
Dim и имеющие постоянные индексы, и
которым не предшествовало
Option Dynamic
, имеют фиксированную длину (не изменяемый размер во время выполнения) и
могут использовать инициализаторы.
Верхняя граница может быть многоточием (
..., 3
точки). Это приведет к тому, что верхняя граница будет автоматически
устанавливаться в зависимости от количества элементов, найденных в
инициализаторе. При многоточии инициализатор обязателен, и он не может быть
Any.
Смотрите страницу
Многоточие для короткого
примера.
Смотрите также
Массивы фиксированной
длины и
Массивы переменной длины.
Инициализаторы
Массивы, переменные, строки, и пользовательские типы (UDT) устанавливаются
на нуль или пустые строки по умолчанию, когда они создаются.
Чтобы избежать накладных расходов на инициализацию переменных, инициализатор
Any
может быть использован с
Dim чтобы сообщить компилятору ,
что только оставляем за собой место для переменной в памяти, но не
инициализировать ее, так что переменная будет содержать мусор. В этом случае
программисту не следует делать предположений о начальных значениях.
Массивам фиксированной длины, переменным, zstrings и определяемым
пользователем типам может быть присвоено значение во время их декларации с
помощью инициализатора. Обратите внимание на разницу между инициализацией
различных типов. Массивы, переменные и определяемые пользователем типы
инициализируются как обычно, с помощью знака равенства (=). Знак
=>
можно использовать, что позволит избежать заявления, напоминающего выражение
при объявлении строки фиксированной длины.
Значения массивов инициализируются значениями, разделенными запятыми и
заключенными в фигурных скобках, а значения UDT разделены запятыми, но в
круглых скобках. Эти методы инициализации переменных могут быть вложены
друг в друга для выполнения сложных заданий. Инициализация позволена для
массивов любого измерения вложенности.
'' Декларация двумерного массива по 5
элементов в размерности
'' и инициализация
Dim array(1 To 2, 1 To 5) As Integer => {{1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}}
'' Декларация простого UDT
Type mytype
var1 As Double
var2 As Integer
End Type
'' Декларация массива из 3 элементов и инициализация
первых
'' 2 mytype элементов
Dim myvar(0 To 2) As mytype => {(1.0, 1), (2.0, 2)}
Для модуля уровня, фиксированной длины, или глобальных переменных,
инициализируемые значения должны быть константными выражениями. FreeBASIC
сообщит об ошибке во время компиляции, если это не так.
Примечание: Инициализация структур UDT со строками не поддерживается в
настоящее время. Инициализация UDT, содержащего поля данных инициализатора
или строк не валидно.
Явные переменные с суффиксами типов
В диалектах
-lang qb и
-lang fblite ,
тип данных переменной может быть указан с суффиксом типа (
$ % # ! & ).
'' Компиляция с -lang qb или fblite
'$lang: "qb"
'' Переменная
string, использующая суффикс типа $
Dim strVariable$
'' Переменная integer ,
использующая суффикс типа %
Dim intVariable%
'' Переменная long ,
использующая суффикс типа &
Dim lngVariable&
'' Переменная single
(одинарная точность для чисел с плавающей точкой) использующая суффикс
типа !
Dim sngVariable!
'' Переменная double (двойная
точность для чисел с плавающей точкой) использующая суффикс
типа #
Dim dblVariable#
Пример
Dim a As Byte
Dim b As Short
Dim c As Integer
Dim d As LongInt
Dim au As UByte
Dim bu As UShort
Dim cu As UInteger
Dim du As ULongInt
Dim e As Single
Dim f As Double
Dim g As Integer Ptr
Dim h As Byte Ptr
Dim s1 As String * 10 '' строка
фиксированной длины
Dim s2 As String '' строка
переменной длины
Dim s3 As ZString Ptr '' zstring
s1 = "Hello World!"
s2 = "Hello World from FreeBASIC!"
s3 = Allocate( Len( s2 ) + 1 )
*s3 = s2
Print "Byte: "; Len(a)
Print "Short: "; Len(b)
Print "Integer: "; Len(c)
Print "Longint: "; Len(d)
Print "UByte: "; Len(au)
Print "UShort: "; Len(bu)
Print "UInteger: "; Len(cu)
Print "ULongint: "; Len(du)
Print "Single: "; Len(e)
Print "Double: "; Len(f)
Print "Integer Pointer: "; Len(g)
Print "Byte Pointer: "; Len(h)
Print "Fixed String: "; Len(s1)
Print "Variable String: "; Len(s2)
Print "ZString: "; Len(*s3)
Deallocate(s3)
Различия диалектов
- В диалектах -lang qb и -lang fblite,
переменные имеют область действия процедуры, если переменная
определена внутри процедуры, и весь модуль, если
переменная определена с Dim Shared.
- В диалектах -lang fb и -lang deprecated ,
переменные, определенные внутри составных блоков операторов (For..Next, While..Wend, Do..Loop, If..Then, Scope..End Scope)
имеют локальные scopes(области видимости),
и видны только внутри этих блоков.
- В диалекте -lang fb, Option
заявления (т.е. Option Base, Option Dynamic),
метакоманды(т.е. $Static) и Def###
заявления (т.е. DefInt) не допускаются.
Отличия от QB
- Инициализаторы переменных являются новыми для FreeBASIC.
- Альтернативный синтаксис Dim As DataType symbolname, [...]
является новым для FreeBASIC.
- Многомерные массивы хранятся в определенном порядке: значения,
отличающиеся только последним индексом являются смежными (row-major порядок). В
QB они хранятся в обратном порядке по умолчанию:
значения, отличающиеся только первым индексом являются смежными (column-major
порядок).
- Массивы переменной длины до 2 ГБ в размере возможны в FreeBASIC. В QB, $STATIC
массивы были ограничены 64 КБ , или доступной памятью DOS (несколько 100 КБ в
лучшем случае) если сделано $DYNAMIC и /AH был использован.
- Форма с многоточием для верхней границы является новой для FreeBASIC.
См. также