FreeBasic
Главная
Вход
Регистрация
Суббота, 21.12.2024, 19:14Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Очистка массива с изменяемыми размерами
Billi_JoДата: Вторник, 31.01.2017, 15:12 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 39
Репутация: 0
Статус: Offline
Использую массив с изменяемыми размерами. После его очистки и обращении к какой-либо ячейки ожидаю получить 0. Вместо этого программа выдает ошибку.
Вот пример искусственного кода отражающий суть проблемы:


Код
redim as ubyte v(1 to 10,1 to 10)
erase v
print v(1,1)
sleep

Почему это происходит и что делать?
 
DarkDemonДата: Вторник, 31.01.2017, 17:56 | Сообщение # 2
Полковник
Группа: Друзья
Сообщений: 200
Репутация: -1
Статус: Offline
В справке:
Erases the element data of one or more variable-length arrays from memory, or clears (re-initializes) all elements in a fixed-length array.

т.е. удаляет данные из памяти для массивов переменной длины(REDIM) или очищает(реинициализирует) все элементы в
массиве фиксированной длины(DIM).

Насколько понимаю простой вызов REDIM вместо ERASE всё очистит, если не использовать ключевое слово PRESERVE.

Код
REDIM Vr(1 TO 10,1 TO 10) AS UBYTE
Vr(1, 1) = 1
PRINT Vr(1, 1)
REDIM Vr(1 TO 10,1 TO 10) AS UBYTE
PRINT Vr(1, 1)
SLEEP


Сообщение отредактировал DarkDemon - Вторник, 31.01.2017, 17:58
 
haavДата: Вторник, 31.01.2017, 21:58 | Сообщение # 3
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата
Насколько понимаю простой вызов REDIM вместо ERASE всё очистит, если не использовать ключевое слово PRESERVE.

Да, все верно.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
Billi_JoДата: Среда, 01.02.2017, 15:30 | Сообщение # 4
Сержант
Группа: Пользователи
Сообщений: 39
Репутация: 0
Статус: Offline
Дело осложнено тем, что массив у меня shared, а обнулить нужно внутри процедуры. Но при объявлении 
Код
redim shared as ubyte v(1 to 10,1 to 10)

внутри процедуры вызывает ругательства компилятора.
В общем, пока записываю нули в массив "вручную".

Вообще, конечно, странно, что erase так себя ведет с массивами с изменяемыми размерами. Что такого нужно записать в ячейки массива, чтобы при обращении к ним вылетала программа?
 
haavДата: Среда, 01.02.2017, 22:34 | Сообщение # 5
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата Billi_Jo ()
Дело осложнено тем, что массив у меня shared, а обнулить нужно внутри процедуры. Но при объявлении
Код
redim shared as ubyte v(1 to 10,1 to 10)

внутри процедуры вызывает ругательства компилятора.
В общем, пока записываю нули в массив "вручную".

Вообще, конечно, странно, что erase так себя ведет с массивами с изменяемыми размерами. Что такого нужно записать в ячейки массива, чтобы при обращении к ним вылетала программа?


Внутри процедуры очищай массив без shared:

Код
redim shared as ubyte v(1 to 10,1 to 10)

Sub PP()
    redim As ubyte v(1 to 10,1 to 10)
End Sub


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
DarkDemonДата: Четверг, 02.02.2017, 11:19 | Сообщение # 6
Полковник
Группа: Друзья
Сообщений: 200
Репутация: -1
Статус: Offline
Цитата Billi_Jo ()
Что такого нужно записать в ячейки массива, чтобы при обращении к ним вылетала программа?

Программа 100% вылетает если идёт обращение к незарезервированной памяти. Можно сделать вывод что ERASE
освобождает память по дескриптеру(который пользователю не доступен). Т.к. последовательность вызовов компилятор
отследить не может из-за ветвлений, то эта фича(освободить память массива) остаётся на откуп программисту.
В QuickBasic тоже самое, если написать REDIM, потом освободить массив через ERASE, доступ к массиву выдаст
"Subscript out of range". ERASE нужен чтобы временно освобождать память для каких-либо нужд, а потом снова её
заводить через REDIM.
Память же заведённая в QB оператором DIM заводится с самого старта программы и ERASE-ом просто очищается,
т.е. не утилизируется(в FB всё так же, + PRESERVE для REDIM). Это можно проверить через FRE(-1).

Цитата Billi_Jo ()
внутри процедуры вызывает ругательства компилятора.

Внутри процедур нельзя объявлять массивы глобально(SHARED).


Сообщение отредактировал DarkDemon - Четверг, 02.02.2017, 11:33
 
Billi_JoДата: Четверг, 02.02.2017, 19:18 | Сообщение # 7
Сержант
Группа: Пользователи
Сообщений: 39
Репутация: 0
Статус: Offline
haavDarkDemon, спасибо за ответы.
 
  • Страница 1 из 1
  • 1
Поиск: