Синтаксиса не знаю, поэтому объясняю на пальцах:
массив[заранее_не_знаю_сколько_элементов]
i:=0
начало_цикла
i:=i+1
элемент_массива[i] = ввод_с_клавы(неск._букв)
если элемент_массива[i] = 'особый_символ' то
выйти из цикла
конец_цикла
Вопрос в том, как бы мне менять границы массива по ходу исполнения программы? Есть ли какие варианты? Может быть, использовать не массивы, а ещё что-то?
В Дельфи легко, в Паскале - не помню - ввели они поддержку открытых массивов или нет. Если нет, то тогда нельзя, можно только через динамическое выделение памяти (оператор new)
В тмт есть open arrays
А что насчет new? Я бы непротив, да только непонятно как. В книжке написано, что массив все равно заранее надо определить.
Можно ли сделать что-то типа:
a:char;
j:=0;
repeat
j:=j+1;
...
new(i[j]));
ReadLn(a);
...
until a='q'
Дело в том, что я к динамической памяти обратился сразу, но что-то несрослось. Как можно отодвигать с помощью new границу массива? Или можно создать с помощью new некую абстрацию типа, скажем, 3-х мерного массива?
В уроке про массивы на pascal.dax.ru посмотри, там есть динамическое выделение памяти под массивы.
Все, что я там понял, так это то, как создать массив, занимающий в памяти более сегмента. Это без проблем, согласен. Но массив, хоть и здоровый, все равно нужно объявить. Я же пытаюсь получить ответ на вопрос: как создать конструкцию, к которой можно обращаться с таким же удобством, как к массиву, и которая меняла бы количество своих элементов и границы по ходу программы? Просто скажите: "такое невозможно", и я отвяжусь, или процитируйте кусок кода, который был бы понятен дилетанту в паскале.
говоришь как изменить число элементов массива?
пишешь тип массива по максимуму(то есть с макс-ым числом элементов)удаляешь предыдущий потом создаёшь новый нужно размерности
(GetMem юзай)
при необходимости заполняешь его значениями из предыдущего массива
Что же до системы с New:
Значит так - каждый элемен массива должен распологаться динамически в памяти, и содержать в себе:
1. Само значение элемента (строка, число, не важно...)
2. Указатель, где в памяти находится следующий элемент.
Таким образом зная указатель на самый первый элемент массива можно прочитать и его значение, и узнать, где находится следующий элемент массива, и так до самого конца. Изменять размер массива можно динамически - это как open arrays, тоесть - хочешь - добавь в конец новый элемент, а в предыдущем укажи ссылку на него, хочешь, вставь между двумя элементами массива ещё один (из предыдущего сделай ссылку на него, а у него сделай ссылку на следующий). Важно, то что при таком методе необходимо в отдельной переменной хранить ссылку на самый первый элемент массива, иначе можно просто потерять весь массив в памяти :)
Вот тебе пример:
Some1:
хе односвязный список проповедуешь,
фигня он)слишком маленькая скорость доступа
хотя для мелких массивов это не заметишь
Я не проповедую, и не большой любитель односвязный массивов. Просто даю человеку необходимую информацию.
Если ты посмотришь на первое сообщение, то там у него в предпологаемом алгоритме присутствует ввод с клавиатуры, который я думаю уже предплолгает, что массив будет "относительно" не большой.
Я это делал так:
прописываешь процедуру, а в ее var-е создаешь массив от 1 до какого-то n, которое вводишь как параметр процедуры.
Обычно работало, но только все равно остаеться ограничение памяти.
8)
Резиновым массивом иногда называют динамические структуры данных: стеки, очереди и т.д
если неизвестно, сколько элементов будет, лучше использовать однонаправленный список.
Зачем самим мучаться с динамическим выделением памяти, когда есть все готовое? Просто работай с массивом как с коллекцией: тип TCollection модуля Objects. Очень мощная штука.
Да, с обычным массивом такое делать нельзя. С динамическим , по-моему, тоже. Разве что каждый раз, когда надо менять размер массива, создавать новый и копировать в него влезшие элементы старого . В голову лезут всякие списки, стеки,... деревья . Пожалуй, есть одна более подходящая идея: реализовать многомерный динамический вектор. Это указатель на массив примерно [0..9] указателей на массив [0..9] указателей... ...на массив [1..10] элементов. Должно храниться общее число элементов. В таком n-мерном векторе может поместиться до 10^n элементов. Доступ, скажем, к 143-му элементу будет выглядеть p^[0]^[0]^[1]^[4]^[3]. Это будет намного быстрее, чем в списке. Памяти на вектор уйдёт больше, чем на обычный массив, но не так уж намного. Дело в том, что она не выделяется сразу для всех 10^n эл-тов, а по мере их добавления, так что, если не ошибаюсь, для хранения m элементов потребуется m div 10 + m div 100 +... + m div 10^(n-1) + n указателей. Менять границы можно new или delete соответствующего кол-ва указателей. Конечно, реализация несколько сложна, но всё вполне нормально пишется.