String
 
Стандартный тип данных: 8-битовая строка символов

Синтаксис

Dim variable As String [ * size]

Описание

String - это массив символов.

String объявленный без параметра size , динамически изменяется в зависимости от длины строки. Длина может варьироваться от 0 байт до 2 гигабайт. Дескриптор содержит указатель на фактическую строку, длину строки и количество пространства, выделенного для нее. VarPtr возвращает указатель на дескриптор, а StrPtr будет указывать на фактическую строку.

Из-за скрытого дескриптора String, ручное распределение памяти, например с помощью функции выделения памяти CAllocate (преимущественно), для String не рекомендуется. Распространенным способом для обеспечения определенного объема пространства резервируемого для String, для предотвращения ненужных выделений внутри цикла , заключается в использовании функций Space или String.

Тем не менее , при необходимости динамического распределения,  можно использовать функции выделения памяти Allocate, CAllocate, Reallocate (см. меры предосторожности при использовании) и строковой указатель (который является указателем на дескриптор строки, а не строковые данные). Когда память выделяется для хранения дескрипторов строки, строка всегда должна быть уничтожена (установить "") прежде чем освобождать каждый дескриптор строки (позволяя освобождать память, принятых строковых данных), в противном случае не возможно освободить его позже, и это может вызвать утечку памяти в программе.

Несмотря на использование дескриптора, неявный символ NULL (Chr(0)) добавляется в конец строки, чтобы разрешить передачу их в функции внешних библиотек не делая медленные копии. FreeBASIC внутренние функции будут игнорировать этот символ и не рассматривать его как часть строки.

String объявленные с фиксированным размером являются строками фиксированной длины QB-стиля, за исключением того, что неиспользуемые символы имеют значение 0, независимо от того, какая опция компилятора "-lang" используется. Она не имеет дескриптор и она не изменяется в соответствии с ее содержимым. Как и в QB , если данные превышают размер строки, они усекаются по правой стороне.
Строки фиксированной длины также завершаются нулевым символом, и поэтому они используют size + 1 байт для пространства. Этот NULL терминатор в будущем может быть удален для предотвращения избыточных символов, усложняющих структуры данных в пользовательских Type.

Имена строковых переменной не нужно заканчивать знаком доллара $ как и в других диалектах BASIC. В диалекте lang fb суффиксы переменных, в том числе знак доллара, запрещены полностью.

Примечание: При передаче String в качестве параметров в Процедуры, они всегда должны быть переданы по ссылке (ByRef). В настоящее время, ByVal не передает копию строки, а Pointer на строковые данные. Это может привести к непредсказуемому поведению в том числе порчу String. Если вы хотите, чтобы предотвратить значения String от изменения, вы должны добавить Квалификатор Const к соответствующему параметру.

Пример


'' Переменной длины
Dim a As String

a = "Hello"
Print a

a += ", world!"
Print a

Var b = "Welcome to FreeBASIC"
Print b + "! " + a


'' QB-подобные суффиксы $
#lang "qb"

'' DIM основанное на суффиксе $
Dim a$
a$ = "Hello"

'' Неявное объявление, основанные на суффиксе $
b$ = ", world!"

Print a$ + b$


'' Строки переменной длины как буферы

'' Резервирование места для строки
'' Используя Space() создаем много символов пробела (ASCII 32)
Var mybigstring = Space(1024)
Print "buffer address: &h" & Hex( StrPtr( mybigstring ), 8 ) & ", length: " & Len( mybigstring )

'' Явным образом уничтожение строки
mybigstring = ""
Print "buffer address: &h" & Hex( StrPtr( mybigstring ), 8 ) & ", length: " & Len( mybigstring )


'' Строка переменной длины в качестве параметра Const

'' Квалификатор const, предотвращает изменение строки
Sub silly_print( ByRef printme As Const String )
    Print ".o0( " & printme & " )0o."
    'Следующая строка приведет к ошибке, если убрать комментарий
    'printme = "silly printed"
End Sub

Var status = "OK"

silly_print( "Hello FreeBASIC!" )
silly_print( "Status: " + status )


Отличия от QB

  • В QB string был ограничен 32767 символами.
  • В QB, неиспользуемые символы в строке фиксированной длины были инициализированы с кодом 32 (пробел, или " ", в ASCII).
  • В QB статические или строки фиксированного размера часто использовались в записях для представления числа байтов данных; например, строка длиной в 1 представляла 1 байт в UDT при чтении из файла. Это невозможно в FreeBASIC , поскольку строки всегда имеют нулевой символ (Null) в конце. При преобразовании QBasic кода, который считывает пользовательские типы из файлов, убедитесь, что все экземпляры "As String * n" переписаны в "As uByte (0 to n - 1)" или ваши файлы будут несовместимы.

См. также