Трехмерный образец

Для моделирования трехмерного образца с задаваемыми размерами X, Y, Z необходим трехмерный массив целых чисел. Как описать, инициализировать, адресно и независимо вводить и считывать по координатам (X, Y, Z) эти числа? Можно ли затем полностью освободить память от этого массива.

begin
  // Объявление и инициализация сразу
  var a := new integer[SizeX, SizeY, SizeZ];
  // Объявление отдельно от инициализации, если вдруг понадобится
  var b: array[,,] of integer;
  
  // Чтение элемента с клавиатуры и запись в массив
  // a.GetLength(2) это то же самое что SizeZ
  a[0, 1, a.GetLength(2)-1] := ReadInteger;
end.

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

Точнее прочитайте хотя бы первую страницу справки. И если понадобится - потом ещё подробнее про то, что такое сборка мусора… Где-нибудь в интернете.

Спасибо.

Если описали массив одновременно с его созданием, можно сразу обращаться к элементу посредством перечисления нужных индексов.

begin
  var (l, m, n) := ReadInteger3('Задайте размеры массива:');
  var a := new real[l, m, n]; // ввести 3 2 4
  a[2, 0, 1] := ReadReal; // ввод
  a[1, 1, 2] := 3.5 * Sqrt(a[2, 0, 1]); // выборка и присваивание
  Writeln(a);
  a := nil; // явно удалить массив
  // иначе массив сам удалится после завершения программы
end.

На самом деле в этом нет необходимости. Локальные переменные объявляются ненужными сразу после последнего их использования. В то же время присвоение nil может не удалять массив сразу, только помечая его ненужным.

Ну, в .Net об на это неправильно тратить внимание. Весь смысл сборки мусора в том, чтобы не думать о том, когда бы удалить объект и фокусироваться больше на логике остальной программы.

Я все понимаю про сборщик. Но вдруг человек хочет явно пометить массив на удаление?

Уважаемые специалисты! Поскольку вы проявили интерес к этой теме приоткрою историю вопроса. Мы занимаемся исследованиями процессов горения твердых систем. Ранее (в 90-х) была написана простенькая программа для моделирования распространения горения в таких образцах в среде Qwick Basic. Сейчас полученные данные и накопленный опыт позволяет замахнуться на создание полноценного коммерческого пакета программ. Поскольку современный Бейсик сильно усложнился, пришлось попробовать PascalABC. Дается с трудом. Если появился интерес, пишите в личку - обрисую текущую ситуацию.

Хм, а до этого остатки массива в зубах застревали? :slight_smile:

Хм, а до этого остатки массива в зубах застревали? Да меня интересовало, нужно ли уничтожать массив до переопределения его размеров, или сборщик мусора сделает это за меня. Кстати, если Вы знаете. Если нужно создать два массива размером 100.000.000 of integer, будут ли они расположены в физической памяти, или в виртуальной, или неизвестно где. Это важно для быстродействия при частом обращении к ним.

А такой массив в стэк вообще влезет?

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

Вообще куча ещё разделена на SOH и LOH, но рядовому пользователю это вряд ли будет важно.

А в физическую память данные попадают только если вы ручками их туда положите. Ну или если система отправит данные в файл подкачки. Но до последнего лучше не доводить…


Но вообще, если вы симулируете что то в таком маштабе - лучше использовать GPU для вычислений. И память тогда выделять тоже на нём же.

Спасибо. Очень подробно. Особенно полезен совет использовать GPU. Предполагается выводить цветное изображение динамики изменения одного из массивов в виде параллелепипеда, да ещё иногда и вращать его.

Насчёт GPU - давно хотел сделать пример симуляции распределения тепла по телу для OpenCLABC. Надо бы сразу с графическим интерфейсом, но до OpenGLABC руки всё не дойдут. Ну раз есть повод - сделал прямо сейчас:

Симуляция тепла.rar (100.5 КБ)

W В начале программы можно поменять с 10, хоть на 100. Если GPU мощный - скорость будет одинаковая, потому что состояние каждого элемента в массиве считается параллельно. Ну, правда, текстовый вывод уже и на 10 задыхается))

Вообще OpenCLABC ещё немного сырой. Но это в первую очередь потому, что я больше времени пишу сам OpenCLABC, чем программы с ним. Недавно сильно улучшил систему авто-тестирования и добавил кучу тестов. Но пока писал этот пример - умудрился поймать 1 мелкий баг (поэтому модули в архиве, там сразу с фиксом).
Если решите его использовать - сообщайте баги что найдёте, постараюсь в течении дня исправлять. Да и, справка, если что, в папке PABCWork.NET\Samples\OpenGL и OpenCL.

Спасибо, но файл rar не распаковывается. Архив поврежден или не тот формат.

Странно, только что скачал - у меня распаковывается. И 7z-ом, и WinRAR-ом. Ну, я использовал формат rar5, то есть самый новый, попробуйте обновить свой архиватор.

Обновил. Распаковал. Пока в Pascale мой уровень гораздо ниже плинтуса. Куда эти файлы переместить и какой запускать? При запуске 2D выдает ошибку компилятора. В личке получили мои пояснения?

Перемещать ничего не надо, как распаковывается всё в 1 папку - так и оставлять.

Запускать - да, 2D.pas. Остальное модули, их запустить не выйдет.

Подробнее.

Да, прочитал, но небыло времени ответить.

При нажатии кнопки Сохранить сообщение компилятора, комп виснет. Но это, наверно, из-за плохой настройки моей Windows 10. Скопипастил в Word. Прилагаю.Ошибка компилятора.doc (34.5 КБ)

То есть это внутренняя ошибка компилятора?

  1. Обновитесь, вроде новую версию только недавно залили на сайт.

  2. У меня нет офиса и засорять им комп в ближайшем будущем не собираюсь. Если кидать файлом - то .txt (так и места меньше занимать будет). А вообще лучше всего:
    Нажмите ПКМ в окне ошибок на эту внутреннюю ошибку (её там тоже выдаёт) и Копировать. Затем вставьте сюда на форум как код, то есть:

    ```
    <<< Сюда вставить
    ```

    Когда текста много - форум сам добавляет скроллбар, так что не волнуйтесь о разбухании сообщения.

Вряд ли. Компилятор скорее целиком сломается, или никак не сломается, если с системой что. Но не для конкретного кода.

У меня этой ошибки нет скорее потому что я обычно живу на последнем билде, которого ещё нет на сайте. А там бывают исправлены баги которые на сайте ещё проявляются. Мне надо знать какую ошибку вам выдаёт - чтоб я мог подредачить что то в вашей версии модуля, чтобы работало пока на сайте версия не догонит.
Если ещё не догнала, поэтому в начале обязательно обновитесь.

Обновил. В редакторе выдает список ошибок. 2D.pas(29) : Переменной ‘Q_1Cycle2’ присвоено значение, но оно нигде далее не используется. OpenCLABCBase.pas(540) : Переменной ‘wr’ присвоено значение, но оно нигде далее не используется. OpenCL.pas(7501) : Ошибка времени выполнения: Не удается загрузить DLL “opencl.dll”: Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E).