Dim
 
Декларирует переменную

Синтаксис

Декларирование одной переменной:
Dim [Shared] symbolname [As DataType] [, ...]
Dim [Shared] As DataType symbolname [, ...]

Декларирование массивов:
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.

См. также