Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Динамический массив


Автор: SlaUr 21.4.2004, 07:12
Вот забыл как это делается.

Нужен пример динамического массива (одномерного) на паскале.
Нужно: Создание нового элемента,обращение к заданному элементу,Удаление элемента массива.

Автор: Guest 21.4.2004, 08:21
Код

var
 g: Array of integer; //Определям массив
begin
 SetLength(g, 2);  //Устанавливаем длинну массива 2 (от 0 до 1)
 g[0] := 1;           // Заносим значения
 g[1] := 2;           //-----------------------
// Че нить делаем..........

 SetLength(g, 5); //переапределям размерность массива
 g[2] := 1;        //   \
 g[3] := 2;        //    - Работаем с добаленными элементами массива
 g[4] := 1;        //  /
end;


Да при попытки обратиться к несуществующи элементам массива ошибка не возникает - буть осторожени smile.gif

Автор: x77 21.4.2004, 10:16
это разве на паскале? я всю жизнь тупил следующим образом:

Код

const
 n = 10;

type
 TArray = array [1..2] of integer;
 PArray = ^TArray;

var
 a: PArray;
 i: integer;

begin
 GetMem (a, SizeOf (integer) * n);
 for i := 1 to n do
   a ^[i] := i;
 end;
 FreeMem (a, SizeOf (integer) * n);
end;


с обращением всё понятно, я думаю, а насчёт добавления и удаления: я обычно создаю новый массив, в который копирую нужные мне элементы. возможно, наверное, перераспределить память, но я так никогда не делал, потому что в результате всяких ReAlloc'ов может измениться сам пойнтер (при добавлении элемента менеджер памяти пожет засунуть его куда угодно, если он не влазит на старое место, и пойнтер после операции может указывать сосвсем в другое место). ничего страшного в этом нет, но... не нравится мне, в общем: как-то надёжнее кажется создать новый массив самому.

Автор: SlaUr 21.4.2004, 11:07
Цитата
g: Array of integer; //Определям массив

В Паскале такой массив не определяется - это наверное только для delphi


Цитата
насчёт добавления и удаления: я обычно создаю новый массив, в который копирую нужные мне элементы


Мне нужна именно возможность добавлять и удалять элементы.
Был у меня хороший пример на паскале , да вот не могу найти :-(
Помню только что там в типе каждого элемента массива был указатель на следующий элемент массива

Автор: x77 21.4.2004, 11:31
SlaUr, не путай, это стеки, или очереди. динамические массивы делаются именно так, как я тебе написал. но это не единственный способ, можно и по другому:

Код

type
 TRecord = record
   Val: integer;
   Next: pointer;
 end;
 PRecord = ^TRecord;

var
 r: PRecord;

procedure AddRecord (var r, Prev: PRecord);
begin
 GetMem (r, SizeOf (TRecord));
 r.Prev := nil;
 if Prev <> nil then
   Prev.Next := r;
end;



ну и т.д., влом писать. смысл в том, что каждый элемент ссылается на предыдущий, а первый ссылается на 0. доступен массив начиная с первого элемента. добавление я привёл, при удалении i-го элемента пробегаем в цикле по всем записям (while Next <> nil - т.е., до последнего элемента), на нужной - переприсваиваем Next, саму запись - освобождаем, и вываливаемся из цикла. доступ - по тому же принципу, циклом.

собственно, это уже и есть очереди. по технологии доступа, по крайней мере, только в очередях можно было работать только с последним элементом, а здесь - с любым.
Добавлено @ 11:38
наврал. "каждый элемент ссылается на предыдущий, а первый ссылается на 0" - каждый элемент ссылается на следующий, а последний - на 0. туплю, сорри.

Автор: poc 21.4.2004, 11:48
Please, напишите код нахождения 10000 простых чисел(Решето Эратосфена)

Автор: SlaUr 21.4.2004, 13:00
x77 Спасибо попробую что-нибудь изобразить (просто хорошие люди попросили сделать задание на Pascal)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)