FreeBasic
Главная
Вход
Регистрация
Суббота, 20.04.2024, 17:25Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Freebasic » Вопросы по языку FreeBasic » Вопрос по массивам
Вопрос по массивам
salexeiyДата: Воскресенье, 29.09.2019, 13:22 | Сообщение # 1
Лейтенант
Группа: Пользователи
Сообщений: 72
Репутация: 2
Статус: Offline
Как работать с массивами, если мне не известна, заранее, длина массива? Прописывать заведомо бОльшую длину или каким то другим способом? Я работаю с файлами переменной длины, от нескольких килобайт, до нескольких мегабайт. Мне нужно построчно считать файл и занести данные в массив.

К примеру, если делать вот так: dim as string xx(), то в процессе наполнения массива, к примеру xx(0)="Первая строка", то программа вылетает с ошибкой.
 
zamabuvaraeuДата: Воскресенье, 29.09.2019, 14:55 | Сообщение # 2
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline

Цитата
о в процессе наполнения массива, к примеру xx(0)="Первая строка", то программа вылетает с ошибкой.

Правильно вылетает. Потому что массив пуст, в нём нет элементов. Вы обращаетесь к элементу с индексом 0, а его не существует, происходит обращение к невыделенной памяти, ошибка сегментации, программа падает.

Варианты решения проблемы.

1. Перед использованием необходимо задать размер массива.
ReDim ( верхняя граница)

Этот оператор уничтожит старый массив и создаст новый.

Если массив уже задан, то предыдущие данные будут удалены. Чтобы не удалять предыдущие данные необходимо использовать ключевое слово Preserve:
ReDim Preserve ( новая верхняя граница)

Здесь тоже будет создан новый массив, но при этом данные из старого массива будут скопированы в новый.

2. Если данные будут постоянно добавляться и удаляться из массива, то вместо массива лучше использовать динамические структуры: список, стэк, очередь, двоичное дерево.

Добавлено (29.09.2019, 14:56)
---------------------------------------------
То есть 
ReDim xx(верхняя граница)

и
ReDim Preserve xx( новая верхняя граница)

 
VitaminДата: Воскресенье, 29.09.2019, 18:24 | Сообщение # 3
Лейтенант
Группа: Пользователи
Сообщений: 55
Репутация: 4
Статус: Offline
salexeiy,  Можно это дело и на макросах реализовать, например так: 
Код
#Macro DobVMas (index, mas, znah) ' #### следим за размером массива ####
   index += 1 ' увеличиваем индекс на 1   
   If index > UBound(mas) Then ' если индекс вышел за верхнюю границу массива   
      ReDim Preserve mas(1 To index * 2) ' увеличиваем размер массива
   EndIf
   mas(index) = znah ' присваиваем значение
#EndMacro ' #####################################################         

Dim As Integer i, indexIn, indexSt, masIn() ' для каждого массива своя переменная для индекса
Dim As String masSt()
ReDim masIn(1 To 1) : ReDim masSt(1 To 1)

DobVMas(indexIn, masIn, 1) ' добавляем числа
DobVMas(indexIn, masIn, 2)
DobVMas(indexIn, masIn, 3)
For i = 1 To indexIn : ? masIn(i) : Next ' выводим массив чисел

DobVMas(indexSt, masSt, "d") ' добавляем строки
DobVMas(indexSt, masSt, "f")
DobVMas(indexSt, masSt, "r")
For i = 1 To indexSt : ? masSt(i) : Next ' выводим массив строк

Sleep





Сообщение отредактировал Vitamin - Воскресенье, 29.09.2019, 18:28
 
salexeiyДата: Воскресенье, 29.09.2019, 19:48 | Сообщение # 4
Лейтенант
Группа: Пользователи
Сообщений: 72
Репутация: 2
Статус: Offline
Спасибо, приму к сведению!
 
Форум » Freebasic » Вопросы по языку FreeBasic » Вопрос по массивам
  • Страница 1 из 1
  • 1
Поиск: