|
9 / 9 / 2
Регистрация: 27.01.2010
Сообщений: 63
|
||||||
Динамические массивы в Delphi27.01.2010, 19:41. Показов 97711. Ответов 3
Метки нет (Все метки)
объясните пожалуйста про массив массивов...задается он таким образом.
если кто знает подскажите плиз если есть способ другой способ задания двумерного массива с клавиатуры (мне уже говорили про setlength,это функция только для одномерных массивов.) заранее спасибо.
5
|
||||||
| 27.01.2010, 19:41 | |
|
Ответы с готовыми решениями:
3
Динамические массивы в Delphi Динамические массивы в Delphi Статические массивы,Динамические массивы,строки |
|
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
||||||||||||||||
| 27.01.2010, 20:23 | ||||||||||||||||
Объявить надо так:
8
|
||||||||||||||||
|
9 / 9 / 2
Регистрация: 27.01.2010
Сообщений: 63
|
|||||||||||||||||||||
| 27.01.2010, 22:50 [ТС] | |||||||||||||||||||||
только что попытался его запустить ,он дальше рандома не проходит.
т.е. там должна быть только одна переменная....я попытался так:
ещё раз,заранее спасибо за помощь)))
1
|
|||||||||||||||||||||
|
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 28.01.2010, 11:46 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Да - там ещё границы изменения индексов неверно заданы.
Сейчас расскажу... Вариант правильного кода выглядит так:
Т. е., т. к. n и m задают длину массива по первому и второму измерениям, то цикл по всем элементам массива должен быть организован так:
Они применимы для любых массивов - для статических и динамических. Применяя функцию High(), код можно переписать так:
Теперь надо пояснить код: High(a) и High(a[i]). High(a) - возвращает верхнее значение индекса в первом измерении массива "a". А High(a[i]) - вернёт верхнее значение индекса во втором измерении для i-й строки. Дело в том, что динамический массив устроен не так как статический. И он может быть непрямоугольной формы. Т. е. например массив "a" может быть таким:
Но массив "a" может быть и непрямоугольным:
Для прямоугольного динамического массива память можно выделить двумя способами:
Таким образом каждый из элементов a[i] представляет собой самостоятельный одномерный динамический массив. Поэтому многомерный дин. массив "a" это на самом деле сборка из нескольких одномерных дин. массивов. --- Одномерный дин. массив, упрощённо, представляет собой переменную типа указатель (занимает в памяти 4 байта), в которой записано целое число типа Integer - это число является адресом байта в памяти, начиная с которого расположены элементы массива. --- Предположим память для массива "а" выделена так: SetLength(a, 3, 5); Физически такой массив будет из себя представлять следующее. Это будет один одномерный динамический массив "а", который содержит указатель на область памяти в которой расположены три элемена. Каждый из этих трёх элементов в свою очередь представляет собой отдельный одномерный динамический массив - т. е. эти элементы тоже являются указателями на некие области в памяти, в каждой из которых располагаются по 5 элементов типа Integer, т. к. массив объявлен так: a : array of array of Integer; --- Если интересно, устройство динамического массива можно рассмотреть подробно. Следует рассмотреть случай одномерного динамического массива. Т. к. как уже говорилось, многомерные динамические массивы это сборки из одномерных дин. массивов. И так, физически переменная типа динамический массив представляет собой переменную размером 4 байта, которая является указателем на область памяти, где расположены элементы массива.
1. Выделяется блок памяти размер которого равен: 3 * SizeOf(Integer) + Length(Arr) * SizeOf(Double) = 3 * 4 + 5 * 8 = 12 + 40 = 52 байта. Кстати, я проверил - на самом деле памяти выделяется немного больше - больше на 2 байта, т. е. в этом примере будет не 52, а 54 байта. Для чего нужны дополнительные 2 байта - не знаю. Но это не суть важно. 2. В первые 4 байта выделенного блока (это байты со смещением 0, 1, 2, 3) записывается размер выделенного блока - это число = 54 = 52 + те самые 2 дополнительных байта. 3. В следующие 4 байта (смещение: 4, 5, 6, 7) записывается количество ссылок на данную структуру. В начале будем иметь здесь число = 1. 4. В следующие 4 байта (смещение: 8, 9, 10, 11) записывается длина массива измеряемая в количестве элементов типа Double - согласно объявлению массива. Т. е. здесь будет записано число = 5. 5. После этого адрес 13-го байта (его смещение = 12) будет записан в переменную Arr. Это адрес байта, начиная с которого расположен первый элемент массива - Arr[0]. Следующий код исследует физическое устройство одномерного дин. массива:
В байтах со смещением 4, 5, 6, 7 относительно PBase расположено целое число равное количеству ссылок на данную структуру. В приведённом примере RefCount = 1. Если, например, дополнительно объявить ещё одну переменную типа дин массив: Arr2 : array of array of Double; А затем в выше представленном коде выполнить: Arr2 := Arr; То новый массив не будет создан, а лишь увеличится количество ссылок RefCount = 2. Если затем сделать так: Arr2 := nil; Тогда вновь окажется RefCount = 1. Если выполнить: Arr := nil; Тогда окажется, что RefCount = 0 при этом произойдёт автоматическое освобождение памяти из под массива, на который ранее ссылалась переменная Arr. Поэтому динамические массивы (как и строки типа String, AnsiString, WideString) называются ссылочными (или динамическими) типами. Для освобождения памяти из под этих типов данных в Delphi применяется технология "уборки мусора" - т. е. память освобождается автоматически, как только окажется, что RefCount = 0. Строки String, AnsiString, WideString устроены точно так же как и одномерные динамические массивы. Т. е. по сути они представляют собой одмерные динамические массивы, содержащие символы. Хотя есть всё же некоторые отличия в том как компилятор Delphi обрабатывает строки и дин. массивы. --- Ещё добавлю про то, как можно вводить двумерные массивы с клавиатуры в консоли.
Есть несколько очень хороших статей по дин. массивам и строкам. Вот:--- 1. Длинные строки и динамические массивы в Delphi. 2. Тонкости работы со строками в Delphi. 3. Строковые типы в Delphi. Особенности реализации и использования. 4. Параметры типа открытый массив и "array of const". --- Эти 4 статьи - это полный комплект знаний по дин. массивам и строкам.
61
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 28.01.2010, 11:46 | |
|
Помогаю со студенческими работами здесь
4
Динамические массивы Динамические массивы
Динамические массивы Динамические массивы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
||||
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1
У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\
А в самом низу файла-профиля. . .
|
PowerShell и онлайн сервисы. Валюта (floatrates.com руб.)
iNNOKENTIY21 11.11.2025
PowerShell функция floatrates-rub
Примеры вызова:
# Указанная валюта 'EUR'
floatrates-rub -Code 'EUR'
# Список имеющихся кодов валют
floatrates-rub -Available
function floatrates-rub {
|
PowerShell и онлайн сервисы. Погода (RP5.ru)
iNNOKENTIY21 11.11.2025
PowerShell функция Get-WeatherRP5rss для получения погоды с сервиса RP5
Примеры вызова
Get-WeatherRP5rss
с указанием id 5484 — Москва (восток, Измайлово) и переносом строки:. . .
|
|
PowerShell и онлайн сервисы. Погода (wttr)
iNNOKENTIY21 11.11.2025
PowerShell Функция для получения погоды с сервиса wttr
Примеры вызова:
Погода в городе Омск с прогнозом на день, можно изменить прогноз на более дней, для этого надо поменять запрос:. . .
|
PowerShell и онлайн сервисы. Валюта (ЦБР)
iNNOKENTIY21 11.11.2025
# Получение курса валют
function cbr (] $Valutes = @('USD', 'EUR', 'CNY')) {
$url = 'https:/ / www. cbr-xml-daily. ru/ daily_json. js'
$data = Invoke-RestMethod -Uri $url
$esc = 27
. . .
|
И решил я переделать этот ноут в машину для распределенных вычислений
Programma_Boinc 09.11.2025
И решил я переделать этот ноут в машину для распределенных вычислений
Всем привет. А вот мой компьютер, переделанный из ноутбука.
Был у меня ноут асус 2011 года. Со временем корпус превратился. . .
|
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
|
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца:
Хочу еще Симбу взять, очень нравится. . .
|