Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизМногомерные динамические массивы Найти похожие ветки
← →
Михаил (2004-04-29 00:25) [0]Всем привет! вопрос собственно в создании сабжа.
допустим нужен двухмерный динамический массив... как это сделать, помогите плиз, очень нужно. я пока пользуюсь просто массивом одномерных массивов и рулю ими с помошью setlength =)
но ведь можно же сделать это "по-людски"! подскажите плиз!
← →
kat (2004-04-29 01:28) [1]var a:array of array of integer;
setlength(a,1000);
for i:=0 to 999 do
setlength(a[i],1000);
Тяжка в справочнике было посмотреть, обязательно на форум кидать?
← →
Юрий Зотов © (2004-04-29 02:35) [2]F1 - "Multidimensional dynamic arrays". С примером.
← →
Михаил (2004-04-29 09:05) [3]спасибо огромное!
kat>> по хелпу посмотреть как-то даже и не догадался =) буду знать сенк =)
← →
Рамиль © (2004-04-29 09:16) [4]
> kat (29.04.04 01:28) [1]
Зачем такая то конструкция?!.
Достаточно
setlength(a, 1000, 1000);
← →
Igorek © (2004-04-29 09:38) [5]F1 конечно круто.
Но имхо для глубокого понимания сути сабжа важно разобраться с указателями и на них самому построить динам. многом. массив.
← →
Sha © (2004-04-29 10:07) [6]Igorek © (29.04.04 09:38) [5]
Я бы больше сказал. Важно понять, что у Борланда вообще нет многомерных динамческих массивов. Они только эмулирутся при помощи динамического массива указателей на одномерные динамические массивы. Отсюда вытекают все особенности их использования.
Михаил (29.04.04 00:25)
Поэтому если умеешь работать с одномерным массивом указателей и с одномерным массивом массивом данных по отдельности, то должен легко представить себе, как можно было бы сэмулировать многомерный массив. Именно это тебе и предлагает Борланд.
← →
Goida © (2004-04-29 10:15) [7]
> Sha
> у Борланда вообще нет многомерных динамческих массивов. Они только эмулирутся при помощи динамического массива указателей на одномерные динамические массивы.
В таком случае: А есть ли тогда хоть в каком-то языке динамические многомерные массивы? ;-J
← →
Sha © (2004-04-29 10:25) [8]Goida © (29.04.04 10:15) [7]
Да, есть. Например, в PL/1 есть локальные в пределах процедуры динамические массивы. Пример начала процедуры (за синтаксис не отвечаю, давно это было):procedure SomeProc(m, n: integer);
integer a(m,n);
begin;
Здесь важно то, что в момент входа в процедуру под массив а(m,n) отводится вся необходимая память размером m*n целых. И никаких указателей, и матрица всегда прямоугольная.
← →
Ega23 © (2004-04-29 10:26) [9]Sha © (29.04.04 10:25) [8]
Но "в кишках" это же всё равно одномерный массив с длиной n*m
← →
Sha © (2004-04-29 10:35) [10]Ega23 © (29.04.04 10:26) [9]
Естественно. И это потому, что это "подлинный" массив, т.е. все его элементы в памяти расположены вплотную друг к другу: элемент за элементом, строка за строкой, слй за слоем и т.д. И Борланда это так для многомерных массивов со статическими границами. А многомерные динамические массивы у них попросту не реализованы. Есть лишь их эмуляция, которую при желании каждый мог бы сделать сам. Впрочем, можно сэмулировать и "подлинный" многомерный массив.
← →
Goida © (2004-04-29 10:39) [11]
> Sha
У тебя есть док-ва, что у Борланда эмулируется именно "не подлинный"?
← →
Ega23 © (2004-04-29 10:39) [12]Указатели, указатели и ещё раз указатели. GetMem, New, FreeMem, Dispose.
← →
Alex44 (2004-04-29 10:43) [13]A pravil"nej (i bystree), navernoe, budet sdelat" odnomernyj,
SetLength(, n*m), i pereschityvat" indexy.
← →
Goida © (2004-04-29 10:45) [14]
> Alex44
Правильней так, как этого требует поставленная задача.
← →
Sha © (2004-04-29 10:50) [15]Goida © (29.04.04 10:39) [11]
Не только у меня, они есть и у тебя, и у Борланда :)
Посмотри пример Юрий Зотов © (29.04.04 02:35) [2]. Как ты думаешь, почему в этом примере именно так устнавливается длина второго измерения?
← →
Sha © (2004-04-29 10:58) [16]Alex44 (29.04.04 10:43) [13]
Этот метод примерно равноценен Борландовскому при малых размерах и чуть быстрее при больших. Но он может значительно проигрывать при попытках изменения внутренних размерностей.
← →
Igorek © (2004-04-29 11:02) [17]
> Sha © (29.04.04 10:35) [10] Впрочем, можно сэмулировать и
> "подлинный" многомерный массив.
...
> и матрица всегда прямоугольная.
Можно узнать как такое возможно? ;-)))
← →
Goida © (2004-04-29 11:09) [18]
> Sha
Во-первых, в этом примере ни слова о машинной реализации. И мы можем только догадываться, что там на самом деле происходит. Попробуй смотреть беспристрастно.
Во-вторых, есть только два способа организовать динамические многомерные массивы: связанные списки или перемещение блоков памяти и выстраивание элементов в цепочку.
← →
Sha © (2004-04-29 11:11) [19]> Igorek © (29.04.04 11:02) [17]
>> Sha © (29.04.04 10:35) [10] Впрочем, можно сэмулировать и
>> "подлинный" многомерный массив.
>> и матрица всегда прямоугольная.
> Можно узнать как такое возможно? ;-)))
Здесь имелось ввиду фиксированное в design time количество размерностей.
В этом случае, вроде, все очевидно. Для матриц:
- отводим память m * n * SizeOf(TElement).
- пишем Get(i,j), Put(i,j) для пересчета индексов.
← →
Sha © (2004-04-29 11:13) [20]> Goida © (29.04.04 11:09) [18]
> Во-первых, в этом примере ни слова о машинной реализации. И мы
> можем только догадываться, что там на самом деле происходит.
> Попробуй смотреть беспристрастно.
Попробуй смотреть в CPU window :)
> Во-вторых, есть только два способа организовать динамические
> многомерные массивы: связанные списки или перемещение блоков
> памяти и выстраивание элементов в цепочку.
Я знаю гораздо больше :)
Посмотри, например, Sha © (29.04.04 11:11) [19]
← →
Goida © (2004-04-29 11:20) [21]
> Sha
Если ты в CPU сам видел организацию, то вопрос вообще отпадает.
Но что смотреть в > Sha © (29.04.04 11:11) [19]? Там что-то новое написано? Как было два, так и осталось - два способа.
← →
Sha © (2004-04-29 11:26) [22]Goida © (29.04.04 11:20) [21]
Да, точно. Третий вариант реализован, например, в Борланд (без связных списков :))
← →
Goida © (2004-04-29 11:33) [23]
> Sha
Без списков - такого не бывает. Тебе все равно где-то необходимо хранить адрес ячеек.
← →
Sha © (2004-04-29 11:39) [24]Goida © (29.04.04 11:33) [23]
Борланд для этого использует массив адресов ячеек.
← →
Goida © (2004-04-29 11:45) [25]
> Sha
А как же он меняет кол-во элементов массива адрессов ячеек???
← →
Sha © (2004-04-29 11:47) [26]Способ #4: хранить данные, разделяя их маркерами начала элемента и начала размерностей (как в Advanced Revelation).
Способ #5: хранить положение и тип маркеров в отдельном массиве.
Способ #6: другой взгляд на массив: ведь, если задуматься, что такое "элемент a[i,j]"? - это "переменная с именем a[i,j]". Достаточно разрешить переменные с такими именами и придумать правила работы с ними (как в REXX).
Есть и другие способы, описанные в умных книжках о структурах данных.
А вообще есть только один способ организовать динамические
многомерные массивы: хранить данные в памяти :))
← →
Sha © (2004-04-29 11:48) [27]Goida © (29.04.04 11:45) [25]
SetLength :)
← →
Goida © (2004-04-29 11:54) [28]
> Sha
Всё с тобой ясно. Ты явно незнаешь организацию памяти. Или прикидываешься таковым. Изучай ассемблер.
Все, о чем ты только что сказал - перемещение блоков памяти и выстраивание элементов в цепочку (только по разному оформленного). Суть неизменна.
← →
Sha © (2004-04-29 11:56) [29]Goida © (29.04.04 11:54) [28]
Hу, ну :)))))))
← →
Goida © (2004-04-29 11:58) [30]
> Hу, ну
Хороший аргумент :-,
← →
Johnmen © (2004-04-29 12:00) [31]>Sha ©
Не спорь с ламерами. Которые, кстати, сами не знают с кем и о чём спорят...
← →
Sha © (2004-04-29 12:01) [32]Goida © (29.04.04 11:58) [30]
Более доступно. Понимание приходит с опытом. Не все женщины одинаковы.
← →
Goida © (2004-04-29 12:05) [33]
> Johnmen
Где аргументы. Словами в воздух и могу кидаться. Но что за ними стоит. Я не пытаюсь переубедить вас, а хочу понять сам. Но пока нет оснований отрекаться от того, что сказал я: либо ты распологаешь все линейно в памити, либо связываешь ячейки памяти (каким угодно способом). Другого не дано. Я не прав? Почему? Где объяснения. А то чем вы занимаетесь, это бравадство...
← →
Goida © (2004-04-29 12:35) [34]Знаете, пришел я к выводу, что вы говорите о языке высокого уровня ипримеры берете из него, а я спускаюсь до низкого уровня... Поэтому и не понимаем мы друг друга... А вообще, говорим об одном и том же...
← →
Sha © (2004-04-29 12:48) [35]Видишь ли, Goida. Все элементы массива - связанная по смыслу совокупность данных. Хранить ее, никак не связывая, невозможно.
Последовательное расположение элементов в памяти - это тоже один из способов связывания элементов.
С этой точки зрения существует всего лишь один способ хранения - связанное хранение элементов массива.
Вопрос в том, как именно это связанное хранение организовано. Именно на низком уровне. Все перечисленные способы этим и отличаются друг от друга. От этого завивисит их эффективность и пригодность в том или ином случае.
Ты просто не заметил этого. Бывает.
← →
Goida © (2004-04-29 12:59) [36]
> Sha
Спасибо. Теперь я понял, с какой позиции вы смотрите. Я с вами согласен.
← →
Anatoly Podgoretsky © (2004-04-29 14:35) [37]Sha © (29.04.04 10:07) [6]
Я бы больше сказал. Важно понять, что у Борланда вообще нет многомерных динамческих массивов. Они только эмулирутся при помощи динамического массива указателей на одномерные динамические массивы.
И даже это не совсем абстрактно,
Можно посмотреть по другому
1. У Борланда динамический массив является указателем с автоматичеким управлением памятью и поддержкой расчета индексов на уровне язиыка.
Определение array of type, если type является динамическим мвссивов, то вступает определение об указателе, и так далее по уровням. Язык обеспечит управление память и доступ к ячейкам по индексу.
← →
Igorek © (2004-04-29 15:37) [38]
> Здесь имелось ввиду фиксированное в design time количество
> размерностей.
> В этом случае, вроде, все очевидно. Для матриц:
> - отводим память m * n * SizeOf(TElement).
> - пишем Get(i,j), Put(i,j) для пересчета индексов.
Надеюсь ты имеешь ввиду динамический массив. В моем понимании таковым является массив в котором размерности при написании кода неизвестны.
← →
WebErr © (2004-04-29 15:41) [39]
> Anatoly Podgoretsky © (29.04.04 14:35) [37]
Я бы даже сказал, что многомерных массивов вообще не существует в машинной логике, это всё "эмуляция" одномерного массива. ;)
← →
Sha © (2004-04-29 15:51) [40]> Igorek © (29.04.04 15:37) [38]
> Надеюсь ты имеешь ввиду динамический массив. В моем понимании
> таковым является массив в котором размерности при написании
> кода неизвестны.
Да. На практике очень часто уже при написании кода оказывается известно количество измерений, хотя верхняя и нижняя граница индекса по каждому измерению могут быть неизвестны. Я имел ввиду этот случай.
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.036 c