<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=51192&amp;view=findpost&amp;p=3879200</guid>
        <pubDate>Sat, 15 Oct 2022 20:05:44 +0000</pubDate>
        <title>Динамический массив</title>
        <link>https://forum.sources.ru/index.php?showtopic=51192&amp;view=findpost&amp;p=3879200</link>
        <description><![CDATA[macomics: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=51192&view=findpost&p=3879189'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Nirvanko &#064; <time class="tag-quote__quoted-time" datetime="2022-10-15T20:57:38+03:00">15.10.22, 17:57</time></span><div class='quote '>Паскаль мертв, ребята.</div></div><br>
Они тебя уже не услышат - кричи в другом месте. На 12 лет опоздал со своими лозунгами.]]></description>
        <author>macomics</author>
        <category>Pascal: Структуры данных</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=51192&amp;view=findpost&amp;p=3879189</guid>
        <pubDate>Sat, 15 Oct 2022 17:57:38 +0000</pubDate>
        <title>Динамический массив</title>
        <link>https://forum.sources.ru/index.php?showtopic=51192&amp;view=findpost&amp;p=3879189</link>
        <description><![CDATA[Nirvanko: Паскаль мертв, ребята.]]></description>
        <author>Nirvanko</author>
        <category>Pascal: Структуры данных</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=51192&amp;view=findpost&amp;p=2677514</guid>
        <pubDate>Tue, 24 Aug 2010 08:54:25 +0000</pubDate>
        <title>Динамический массив</title>
        <link>https://forum.sources.ru/index.php?showtopic=51192&amp;view=findpost&amp;p=2677514</link>
        <description><![CDATA[volvo877: Приведу также пример создания <span class="tag-color tag-color-named" data-value="blue" style="color: blue"><strong class='tag-b'>трехмерного массива - куба</strong></span>.<br>
<br>
Вообще, пользуясь тем методом, который применялся выше, можно выделить и двумерные, и трех-, и четырех- и более <em class='tag-i'>-мерные</em> структуры. Но все-же я решил добавить отдельный пост для того, чтобы<br>
<ul class="tag-list"><li>еще раз напомнить, в каком порядке должна выделяться/освобождаться память;</li><li>показать возможность использования подпрограмм для работы с динамическими массивами;</li><li>(самое главное): вышеописанные программы будут работать только в режиме {&#036;R-}, то есть, при отключенном контроле границ. Иначе при попытке обращения к элементу с индексом, б<strong class='tag-b'>о</strong>льшим, чем 1 будет возникать ошибка времени выполнения (RunTime Error), ведь все массивы описаны как <em class='tag-i'>Array [1 .. 1] Of ...</em>, и обращение ко второму элементу - уже ошибка. Здесь я хочу показать, что можно работать с динамическими массивами, и при этом не терять возможности контроля границ для всех остальных частей программы (Не будете же вы отключать {&#036;R} перед обращением к дин. массиву, и сразу после него опять включать режим {&#036;R} обратно? Есть более простой способ).</li></ul><br>
Итак:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{ Программа работает при включенном контроле границ }</div><div class="code_line">{$R+}</div><div class="code_line">program Test;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;T = Word;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;{ Строка матрицы }</div><div class="code_line">&nbsp;&nbsp;MyVector &nbsp;= Array [1 .. MaxInt div SizeOf(T)] of T;</div><div class="code_line">&nbsp;&nbsp;PMyVector = ^MyVector;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;{ Матрица }</div><div class="code_line">&nbsp;&nbsp;MyMatrix &nbsp;= Array[1 .. MaxInt div SizeOf(PMyVector)] of PMyVector;</div><div class="code_line">&nbsp;&nbsp;PMyMatrix = ^MyMatrix;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;{ Куб - третье измерение }</div><div class="code_line">&nbsp;&nbsp;MyCube &nbsp;= Array[1 .. MaxInt div SizeOf(PMyMatrix)] of PMyMatrix;</div><div class="code_line">&nbsp;&nbsp;PMyCube = ^MyCube;</div><div class="code_line">&nbsp;</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;Создаем динамический &quot;кубик&quot; из Depth матриц, каждая из которых</div><div class="code_line">&nbsp;&nbsp;имеет Height строк и Width столбцов.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Указатель на выделенную память возвращается как результат функции.</div><div class="code_line">}</div><div class="code_line">function CreateCubeArray(Width, Height, Depth: Integer): PMyCube;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Cube: PMyCube;</div><div class="code_line">&nbsp;&nbsp;i, j: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;GetMem(Cube, Depth * SizeOf(PMyMatrix));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for i := 1 to Depth do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;GetMem(Cube^[i], Height * SizeOf(PMyVector));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for j := 1 to Height do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;GetMem(Cube^[i]^[j], Width * SizeOf(T));</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;CreateCubeArray := Cube;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;Освобождаем ранее выделенную под &quot;кубик&quot; память.</div><div class="code_line">&nbsp;&nbsp;Внимательнее с порядком освобождения: сначала - массивы,</div><div class="code_line">&nbsp;&nbsp;потом - матрицы, и только в самом конце - куб.</div><div class="code_line">}</div><div class="code_line">procedure DisposeCubeArray(var Cube: PMyCube;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Width, Height, Depth: Integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i, j: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;for i := 1 to Depth do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;for j := 1 to Height do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FreeMem(Cube^[i]^[j], Width * SizeOf(T));</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FreeMem(Cube^[i], Height * SizeOf(PMyVector))</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;FreeMem(Cube, Depth * SizeOf(PMyMatrix));</div><div class="code_line">&nbsp;&nbsp;Cube := nil;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;В данной процедуре также обратите внимание на правильный порядок</div><div class="code_line">&nbsp;&nbsp;индексов.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Первый слева индекс (&quot;глубина&quot;) должен изменяться в интервале 1 .. Depth</div><div class="code_line">&nbsp;&nbsp;Второй (&quot;высота&quot;) - в интервале 1 .. Height</div><div class="code_line">&nbsp;&nbsp;Третий (&quot;ширина&quot;) - в интервале 1 .. Width</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Если вы перепутаете индексы местами - то программа либо вылетит</div><div class="code_line">&nbsp;&nbsp;с ошибкой (например, разыменование нулевого указателя), если</div><div class="code_line">&nbsp;&nbsp;текущее значение какого-либо индекса БОЛЬШЕ, чем было задано</div><div class="code_line">&nbsp;&nbsp;при создании &quot;куба&quot;, либо просто будет отображать ваш &quot;кубик&quot;</div><div class="code_line">&nbsp;&nbsp;неправильно.</div><div class="code_line">}</div><div class="code_line">procedure PrintCubeArray(Arr: PMyCube;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Width, Height, Depth: Integer);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i, j, k: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if Arr &#60;&#62; nil then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i := 1 to Depth do</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for j := 1 to Height do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for k := 1 to Width do Write(Arr^[i]^[j]^[k]:4);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;WriteLn;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;WriteLn;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;&nbsp;else WriteLn(&#39;&#60;пусто&#62;&#39;)</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;cubeWidth &nbsp;= 3;</div><div class="code_line">&nbsp;&nbsp;cubeHeight = 2;</div><div class="code_line">&nbsp;&nbsp;cubeDepth &nbsp;= 2;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;myArray: PMyCube;</div><div class="code_line">&nbsp;&nbsp;i, j, k: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;myArray := CreateCubeArray(cubeWidth, cubeHeight, cubeDepth);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for i := 1 to cubeDepth do</div><div class="code_line">&nbsp;&nbsp; &nbsp;for j := 1 to cubeHeight do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for k := 1 to cubeWidth do myArray^[i]^[j]^[k] := i*j*k;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;PrintCubeArray(myArray, cubeWidth, cubeHeight, cubeDepth);</div><div class="code_line">&nbsp;&nbsp;DisposeCubeArray(myArray, cubeWidth, cubeHeight, cubeDepth);</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>volvo877</author>
        <category>Pascal: Структуры данных</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=51192&amp;view=findpost&amp;p=337007</guid>
        <pubDate>Mon, 12 Apr 2004 20:04:49 +0000</pubDate>
        <title>Динамический массив</title>
        <link>https://forum.sources.ru/index.php?showtopic=51192&amp;view=findpost&amp;p=337007</link>
        <description><![CDATA[romtek: <span class='tag-size' data-value='12' style='font-size:12pt;'><strong class='tag-b'>1) Для одномерного массива</strong></span><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{$R-}</div><div class="code_line">{ Отключаем проверку компилятором границ массива. Необходимо для дин. массивов в Турбо Паскале }</div><div class="code_line">Type</div><div class="code_line">&nbsp;&nbsp;MyType={здесь описываешь тип элемента массива, скажем} Word;</div><div class="code_line">Type</div><div class="code_line">&nbsp;&nbsp;MyArray=Array[1..1] of MyType; &nbsp;{Описываем массив всего из 1 элемента}</div><div class="code_line">&nbsp;&nbsp;MyArrayPtr=^MyArray;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;DynamicArray: MyArrayPtr; &nbsp; &nbsp; &nbsp; {Это указатель на наш динамически массив}</div><div class="code_line">&nbsp;&nbsp;Count, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{Это вводимый размер массива}</div><div class="code_line">&nbsp;&nbsp;I,Size: Word;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp;{Вводим размер массива} &nbsp;</div><div class="code_line">&nbsp;&nbsp;Write(&#39;Число элементов массива: &#39;);</div><div class="code_line">&nbsp;&nbsp;ReadLn(Count);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;{ выделяем под него память: &nbsp;Count x РазмерТипа } &nbsp;</div><div class="code_line">&nbsp;&nbsp;Size:=Count*SizeOf(MyType);</div><div class="code_line">&nbsp;&nbsp;GetMem(DynamicArray,Size);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;{заполняем наш массив значениями}</div><div class="code_line">&nbsp;&nbsp;For I:=1 to Count do DynamicArray^[I]:=I;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;For I:=1 to Count do</div><div class="code_line">&nbsp;&nbsp; &nbsp;Write(DynamicArray^[I]:4); &nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;{освобождаем зарезервированную память для массива}</div><div class="code_line">&nbsp;&nbsp;FreeMem(DynamicArray,Size)</div><div class="code_line">End.</div></ol></div></div></div></div><br>
<br>
<span class='tag-size' data-value='12' style='font-size:12pt;'><strong class='tag-b'>2) Для двумерного массива (матрицы)</strong></span><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{ (C) volvo877 }</div><div class="code_line">{$R-}</div><div class="code_line">Type</div><div class="code_line">&nbsp;&nbsp;MyType = Word;</div><div class="code_line">Type</div><div class="code_line">&nbsp;&nbsp;PMyVector = ^MyVector;</div><div class="code_line">&nbsp;&nbsp;{ &quot;Строка&quot; динамической матрицы }</div><div class="code_line">&nbsp;&nbsp;MyVector = Array[1 .. 1] of MyType;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;MyArrayPtr = ^MyArray;</div><div class="code_line">&nbsp;&nbsp;{ Сама матрица - представляется как массив указателей на &quot;строки&quot; }</div><div class="code_line">&nbsp;&nbsp;MyArray = Array[1 .. 1] of PMyVector;</div><div class="code_line">&nbsp;</div><div class="code_line">Var</div><div class="code_line">&nbsp;&nbsp;DynamicArray: MyArrayPtr; &nbsp; { Указатель на матрицу }</div><div class="code_line">&nbsp;&nbsp;Count,</div><div class="code_line">&nbsp;&nbsp;I,J,Size: Word;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp;Write(&#39;Число элементов массива: &#39;);</div><div class="code_line">&nbsp;&nbsp;ReadLn(Count);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;{ Выделяем память под указатели на &quot;строки&quot; }</div><div class="code_line">&nbsp;&nbsp;GetMem(DynamicArray, Count * SizeOf(PMyVector));</div><div class="code_line">&nbsp;&nbsp;{ И для каждой &quot;строки&quot; - выделяем память для хранения данных } </div><div class="code_line">&nbsp;&nbsp;For i := 1 To Count Do </div><div class="code_line">&nbsp;&nbsp; &nbsp;GetMem(DynamicArray^[i], Count*SizeOf(MyType));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;For I:=1 to Count do { Lines }</div><div class="code_line">&nbsp;&nbsp; &nbsp;For J:=1 to Count do { Columns }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{ Немного изменяется способ обращения к элементу матрицы }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;DynamicArray^[I]^[J]:=I*J;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;For I:=1 to Count do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; WriteLn;</div><div class="code_line">&nbsp;&nbsp; &nbsp; For J:=1 to Count do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; Write(DynamicArray^[I]^[J]:4);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;{ Освобождаем память в обратном порядке: }</div><div class="code_line">&nbsp;&nbsp;{ Сначала - удаляем все &quot;строки&quot; }</div><div class="code_line">&nbsp;&nbsp;For i := 1 To Count Do</div><div class="code_line">&nbsp;&nbsp; &nbsp;FreeMem(DynamicArray^[i], Count*SizeOf(MyType));</div><div class="code_line">&nbsp;&nbsp;{ А теперь и указатели на них ... }</div><div class="code_line">&nbsp;&nbsp;FreeMem(DynamicArray, Count * SizeOf(PMyVector));</div><div class="code_line">End.</div></ol></div></div></div></div>]]></description>
        <author>romtek</author>
        <category>Pascal: Структуры данных</category>
      </item>
	
      </channel>
      </rss>
	