Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамический массив, Пример на pascal 
:(
    Опции темы
SlaUr
Дата 21.4.2004, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



Вот забыл как это делается.

Нужен пример динамического массива (одномерного) на паскале.
Нужно: Создание нового элемента,обращение к заданному элементу,Удаление элемента массива.
PM MAIL   Вверх
Guest
Дата 21.4.2004, 08:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код

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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



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

Код

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'ов может измениться сам пойнтер (при добавлении элемента менеджер памяти пожет засунуть его куда угодно, если он не влазит на старое место, и пойнтер после операции может указывать сосвсем в другое место). ничего страшного в этом нет, но... не нравится мне, в общем: как-то надёжнее кажется создать новый массив самому.



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
SlaUr
Дата 21.4.2004, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



Цитата
g: Array of integer; //Определям массив

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


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


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

Это сообщение отредактировал(а) SlaUr - 21.4.2004, 11:19
PM MAIL   Вверх
x77
Дата 21.4.2004, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



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. туплю, сорри.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
poc
Дата 21.4.2004, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 21.4.2004

Репутация: нет
Всего: нет



Please, напишите код нахождения 10000 простых чисел(Решето Эратосфена)
PM MAIL   Вверх
SlaUr
Дата 21.4.2004, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



x77 Спасибо попробую что-нибудь изобразить (просто хорошие люди попросили сделать задание на Pascal)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0725 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.