Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Двумерный массив


Separator ©   (2005-11-24 10:27:00) 

Как проще всего сделать двумерный массив, чтобы потом легко изменять его размеры, удалять и вставлять строки, и столбцы?


Separator   (2005-11-24 12:23:00) [1]

В общем, сдвигаю move во всех ветках и потом общим SetLength уменьшаю, также при удалении в корне


Separator   (2005-11-24 12:20:00) [2]

ясно, спасибо


begin...end   (2005-11-24 12:17:00) [3]

> Separator ©   (24.11.05 11:59) [15]

Ну, что такое одномерный динамический массив, думаю, понятно. Это указатель на память, в котором последовательно расположены элементы массива. Двумерный динамический массив можно рассматривать как динамический массив, элементами которого являются динамические массивы.

Пример:

var
 A: array of array of Integer;
begin
 SetLength(A, 2, 5);
end.

Здесь переменная A -- это указатель на память, в которой последовательно расположены две ссылки (указателя) на "внутренние" массивы. В свою очередь, эти ссылки указывают на области памяти, в каждой из которых размещено (непрерывно) по 5 элементов типа Integer. Поэтому, если речь идёт про удаление элемента в пределах одного самого внутреннего массива (например, A[1][2]), то это можно сделать сдвигом:

Move(A[1, 3], A[1, 2], 2 * sizeof(Integer));
SetLength(A[1], Pred(Length(A[1])));

но при этом нет никаких оснований утверждать, что первые 5 Integer-элементов (т.е. тело массива A[0]) находятся по соседству с другими 5 элементами (телом массива A[1]).


Separator   (2005-11-24 11:59:00) [4]

как такой массив расположен в памяти?
допустим в одномерных массивах при удалении элемента в середине просто с помощью move сдвигал данные "на лево" и конец отсекал SetLength
А тут так можно сделать?


begin...end   (2005-11-24 11:52:00) [5]

> Separator ©   (24.11.05 11:51) [13]

Да, в обоих приведённых случаях данные сохранятся.


Separator   (2005-11-24 11:51:00) [6]

В общем так:


var
    M: array of array of Integer;
begin
    SetLength(M, 3, 4);
    //заполняем, потом хочу увеличить так
    SetLength(M, 5, 4);
    // Данные сохранятся? А если так?
    SetLength(M, 6, 5);
    //Массив просто разрастется?
end;


begin...end   (2005-11-24 11:34:00) [7]

> Separator ©   (24.11.05 11:29) [11]

Добавление элементов в концы строк (столбцов)? Тогда [8].


Separator   (2005-11-24 11:29:00) [8]

про удаление знаю что сложно, пока нужно только произвольное наращивание


umbra   (2005-11-24 11:22:00) [9]

2 begin...end ©   (24.11.05 11:15) [9]

кто бы сомневался, я не буду :)
просто, как я понял, автор хочет легко удалять и строки, и столбцы, что совсем уж легко не получится никак


begin...end   (2005-11-24 11:15:00) [10]

> Separator ©   (24.11.05 10:27)

> легко изменять его размеры, удалять и вставлять строки,
> и столбцы?

Типичные требования, которым удовлетворяет связанный список. В смысле, [4].

> umbra ©   (24.11.05 11:13) [8]

Двумерный динамический массив.


umbra   (2005-11-24 11:13:00) [11]

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


Separator   (2005-11-24 11:03:00) [12]

Допустим первоначально не известно максимальное количество элементов в строке или в столбце.
Например, я считываю файл с данными и мне нужно паралельно их анализировать и заполнять массив, количество элементов в строке не известно и может быть разным по отношению к разным строкам, но в результате мне нужно получить двумерный массив, а недостающие элементы просто заполнить нулями.
В данном случае одномерный массив не подойдет, просто не удобно будет расширять его.


Separator   (2005-11-24 10:51:00) [13]


> umbra ©   (24.11.05 10:47) [3]

А при изменении размера?


Separator   (2005-11-24 10:51:00) [14]


> umbra ©   (24.11.05 10:47) [3]

А при изменении размера?


Sandman29   (2005-11-24 10:47:00) [15]

Список списков.


umbra   (2005-11-24 10:47:00) [16]

одномерный массив nxm элементов. индексы известны, удалять легко


Separator   (2005-11-24 10:43:00) [17]

не пойдет, дерево с двумя ветками, это n*2 значений
а мне надо n*m значений


tesseract   (2005-11-24 10:34:00) [18]

Может дерево с двумя ветками?


Наверх

Титульная страница Поиск, карта сайта Написать письмо