Динамические массивы
 

Здравствуйте! Эта страница объясняет правильное использование динамических массивов в FreeBASIC. Многие люди имеют некоторые проблемы с этим, и я чувствовал, что стоит написать об этом.

Массивы они могут быть использованы и изменены по всей программе, с небольшими трудностями. Во-первых, мы должны обсудить создание динамических массивов. В том же коде, я объясню, как измененять размерность глобального динамического массива в процедуре или функции. Прочитайте комментарии в коде, чтобы лучше понять все.

Declare Sub mySub ()

' по состоянию на 0.17, OPTION DYNAMIC and '$DYNAMIC являются ненужными. Необходимо определять массив динамичным каждый раз
' как вы можете видеть, следующие шаги успешны в создании динамического массива
Dim Shared myArray1() As UByte
ReDim Shared myArray2(0) As UByte

mySub

' Глобальные массивы доступны из любой точки в модуле
Print myArray1(5) ' будет напечатано 2
Print myArray2(6) будет напечатано 3

Sub mySub ()
    ' не используйте "redim shared" в sub или function! даже если он глобальный, необходимо опустить слово "shared" для того, чтобы работало
    ReDim myArray1(0 To 9) As UByte
    ReDim myArray2(0 To 9) As UByte
    myArray1(5) = 2
    myArray2(6) = 3
End Sub


Теперь вы можете быть удивлены, как вы можете изменять размерность массива при использовании ключевого слова PRESERVE. Как правило вы просто добавляете PRESERVE для REDIM. Тем не менее это работает только если меняется только первое измерение массива! Например следующая программа не будет работать должным образом:

' объявить очищенный динамический массив
ReDim Shared myArray(0 To 9, 0 To 9) As UByte
Dim As UByte x, y, i

' заполняем массив значениями
For y = 0 To 9
    For x = 0 To 9
        i += 1
        myArray(x, y) = i
    Next x
Next y

' показываем, что значения являются хорошими первоначально:
For y = 0 To 9
    For x = 0 To 9
        Print Using "##,"; myArray(x, y);
    Next x
    Print
Next y
Print
Print "Press a key..."
Sleep
Cls

' изменяем размерность массива
ReDim Preserve myArray(0 To 18, 0 To 12) As UByte

' значения не сохранились должным образом!
For y = 0 To 9
    For x = 0 To 9
        Print Using "##,"; myArray(x, y);
    Next x
    Print
Next y

Sleep
End


Попробуйте и вы увидите, что он не работает должным образом. Это потому, что только первое измерение в массиве может изменять размеры, а остальные остаются с тем же размером, для того чтобы PRESERVE работал правильно.

Существует обходной путь, который я отправлю позже, после того как я отредактирую его для того, чтобы можно было применить к любой программе, а не только к моей. Я стараюсь подходить к вопросу творчески ;)