Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π€ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ… Π² DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 12

Автор Π”ΠΆΡƒΠ»ΠΈΠ°Π½ Π‘Π°ΠΊΠ½Π΅Π»Π»

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ понятиС Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ссылок. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ массива располоТСны Π² памяти ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Ρ€ΡƒΠ³ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ. ΠŸΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ всСх элСмСнтов сама опСрационная систСма способствуСт высокой скорости Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΎΠ΄Π½ΠΎΠΉ страницС памяти Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ сразу нСсколько элСмСнтов, поэтому Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° страницами ΠΌΠ΅ΠΆΠ΄Ρƒ диском ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π΅ придСтся.

Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ рассматривали Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прСимущСства массивов, Π½ΠΎ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ Π·Π½Π°Ρ‚ΡŒ ΠΈ ΠΎΠ± ΠΈΡ… нСдостатках. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ нСдостаток связан с опСрациями вставки ΠΈ удалСния элСмСнтов. Π§Ρ‚ΠΎ происходит, Ссли, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² массив Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт с индСксом n? Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС, всС элСмСнты с индСксами, начиная с n ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° массива, потрСбуСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ мСсто ΠΏΠΎΠ΄ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт. А фактичСски выполняСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°:


{сначала ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ мСсто ΠΏΠΎΠ΄ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт}

for i := LastElement downto N do

MyArray[i+1] := MyArray[i];

{Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ с индСксом N}

MyArray[N] := NewElement;

{ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Ρ‹ массива Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ}


inc(LastElementIndex);


(ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Ρ†ΠΈΠΊΠ» замСняСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Move.)


Рисунок 2.1. Вставка Π² массив Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта


Рисунок 2.2. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнта ΠΈΠ· массива


ОбъСм памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚ ΠΏΡ€ΠΈ вставкС Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта, зависит ΠΎΡ‚ значСния n ΠΈ количСства элСмСнтов Π² самом массивС. Π§Π΅ΠΌ большС количСство элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ, Ρ‚Π΅ΠΌ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ потрСбуСтся Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π’ΠΎ Π΅ΡΡ‚ΡŒ, врСмя, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π° For, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ количСству элСмСнтов Π² массивС. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, вставка Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта Π² массив ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ классу ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ O(n).

Π’ΠΎΡ‚ ΠΆΠ΅ Ρ…ΠΎΠ΄ рассуТдСний справСдлив ΠΈ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ удалСния элСмСнта ΠΈΠ· массива. Но Π² этом случаС ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнта с индСксом n ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ элСмСнты, начиная с индСкса n + 1 ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° массива, Π±ΡƒΠ΄ΡƒΡ‚ пСрСнСсСны Π½Π° ΠΎΠ΄Π½Ρƒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ массива, Ρ‡Ρ‚ΠΎΠ±Ρ‹ "Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ" ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π²ΡˆΡƒΡŽΡΡ ΠΎΡ‚ удалСния элСмСнта "Π΄Ρ‹Ρ€Ρƒ". Как ΠΈ Π² случаС со вставкой, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ классу ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ O(n).


{ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ элСмСнт, пСрСмСстив ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π° Π½ΠΈΠΌ элСмСнты Π½Π° ΠΎΠ΄Π½Ρƒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π²ΠΏΠ΅Ρ€Π΅Π΄}

for i := N+ 1 to LastElementIndex do

MyArray[i-1] := MyArray[i];

{ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Ρ‹ массива Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ}

dec(LastElementIndex);


(ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Ρ†ΠΈΠΊΠ» замСняСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Move.)

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ вставки ΠΈ удалСния элСмСнта ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ количСства элСмСнтов Π² массивС Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ ΠΊ классу ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ O(n).

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ вопрос, связанный со вставкой ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ элСмСнтов, - Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… элСмСнтов, Ρ‚.Π΅. Π² качСствС послСднСго элСмСнта массива Π½ΡƒΠΆΠ½ΠΎ ввСсти ΡΠΈΠ³Π½Π°Π»ΡŒΠ½Ρ‹ΠΉ (sentinel) элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΊΠΎΠ½Ρ†Π° массива. (Π’ строках с Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΌ Π½ΡƒΠ»Π΅ΠΌ Ρ‚Π°ΠΊΠΈΠΌ ΡΠΈΠ³Π½Π°Π»ΡŒΠ½Ρ‹ΠΌ элСмСнтом являСтся символ #0.) Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π²ΠΎ врСмя компиляции ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ массивы фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° (сСйчас ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… увСличСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² массивов), Π°, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, для этого Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ количСство Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… элСмСнтов. Π’ Π΄Π²ΡƒΡ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… для хранСния количСства Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… элСмСнтов использовалась пСрСмСнная LastElementIndex. Π’ строках ΠΈ Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… строках, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² самой строкС, содСрТится счСтчик количСства символов. Но Ссли ΠΌΡ‹ Π½Π΅ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вставку ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнтов, Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов Π½Π΅ трСбуСтся.

Π‘Ρ‚ΠΎΠΈΡ‚ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΈ ΠΎΠ± Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅, которая касаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ программирования Π² Delphi1. Π’ Delphi1 ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ объСм Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ³ΠΎ выдСляСмого Π±Π»ΠΎΠΊΠ° памяти (ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π±Π΅Π· написания Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° ассСмблСрС) Ρ€Π°Π²Π΅Π½ 64 Кб. Если объСм ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта массива составляСт 100 Π±Π°ΠΉΡ‚, Ρ‚ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² массивС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ большС 655 Ρ‚Π°ΠΊΠΈΡ… элСмСнтов. НС Ρ‚Π°ΠΊ ΡƒΠΆ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ. Π­Ρ‚ΠΎ 64-КбноС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ придСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° элСмСнты (ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π·Π½Π°ΠΌΠ΅Π½ΠΈΡ‚ΠΎΠΌ классС TList), Π° Π½Π΅ сами элСмСнты (Π² массивС TList Π² Delphi1 количСство элСмСнтов ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ числом 16 383).

ДинамичСскиС массивы

Часто приходится ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ использования массива, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ количСство элСмСнтов Π² Ρ‚Π°ΠΊΠΎΠΌ массивС Π·Π°Ρ€Π°Π½Π΅Π΅ Π½Π΅ извСстно - ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π΅ΡΡΡ‚ΡŒ, сто ΠΈΠ»ΠΈ тысяча, Π½ΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ количСство элСмСнтов Π±ΡƒΠ΄Π΅Ρ‚ извСстно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΈΠ·-Π·Π° нСзнания количСства элСмСнтов, Π΅Π³ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ (объявлСниС массива с максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ количСством элСмСнтов ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ΅ стСка, особСнно это касаСтся Delphi1). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ элСмСнты массива Π»ΡƒΡ‡ΡˆΠ΅ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈΠ· ΠΊΡƒΡ‡ΠΈ.

Но Π΄Π°ΠΆΠ΅ Π² этом случаС Π½Π΅ всС нСдостатки ΡƒΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ количСство элСмСнтов Π² массивС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π²Ρ‹ΡΠΈΡ‚ΡŒ 100. Но Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ "Π½ΠΈΠΊΠΎΠ³Π΄Π°", ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΎΠ΄ΠΈΠ½ прСкрасный дСнь количСство элСмСнтов ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ 101. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ пСрСзаписи памяти ΠΈΠ»ΠΈ возникновСнию ошибок Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ доступа (Ссли, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π² ΠΊΠΎΠ΄Π΅ Π½Π΅ использовались утвСрТдСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ провСряли Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΡ количСства элСмСнтов Π½Π°Π΄ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ).

Одним ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ уходят корнями Π΅Ρ‰Π΅ ΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½Π°ΠΌ языка Pascal, являСтся созданиС Ρ‚ΠΈΠΏΠ° массива со всСго ΠΎΠ΄Π½ΠΈΠΌ элСмСнтом ΠΈ указатСля Π½Π° этот массив:


type

PMyArray : ^TMyArray;

TMyArray : array[0..0] of TMyType;


Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ массив Ρ‚ΠΈΠΏΠ° TMyType, ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ количСство элСмСнтов:


var

MyArray : PMyArray;

begin

GetMem(MyArray, 42 * sizeof(TMyType));

... использованиС массива MyArray...

FreeMem(MyArray, 42*sizeof(TMyType));


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° FreeMem ΠΏΡ€ΠΈ освобоТдСнии Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° памяти Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Delphi1 Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ указания Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±Π»ΠΎΠΊΠ°. ВсС 32-разрядныС вСрсии Delphi ΠΈ Kylix хранят Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π² самом Π±Π»ΠΎΠΊΠ΅. Π Π°Π·ΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ° находится нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ Π±Π»ΠΎΠΊΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ GetMem. Π’ послСдних вСрсиях Delphi ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Π² качСствС Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ° игнорируСтся, Π° вмСсто Π½Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ скрытоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π”ΠΎ освобоТдСния памяти MyArray ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° массив, состоящий ΠΈΠ· 42 элСмСнтов Ρ‚ΠΈΠΏΠ° TMyType. НСсмотря Π½Π° свою простоту, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ нСдостатками, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… всСгда Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ нСльзя ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² ($R+), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ компилятор считаСт, Ρ‡Ρ‚ΠΎ массив Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ элСмСнт, Π°, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ индСкс 0.

(ΠžΡ‚ этого нСдостатка ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ, Ссли ΠΏΡ€ΠΈ объявлСнии массива ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ содСрТит Π½Π΅ ΠΎΠ΄ΠΈΠ½ элСмСнт, Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅, достаточно большоС, количСство элСмСнтов. Но Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ привносит свою ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ: всС индСксы Π΄ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ массив ΠΈΠ· 42 элСмСнтов, основанный Π½Π° массивС ΠΈΠ· 1000 элСмСнтов, Ρ‚ΠΎ для компилятора индСксы ΠΎΡ‚ 42 Π΄ΠΎ 999 Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ.)

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, описанный ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‡Π΅Π½ΡŒ ΡˆΠΈΡ€ΠΎΠΊΠΎ примСняСтся Π² повсСднСвном ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ. НапримСр, Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ SysUnit содСрТится ΠΎΡ‡Π΅Π½ΡŒ Π³ΠΈΠ±ΠΊΠΈΠΉ Ρ‚ΠΈΠΏ массива TByteArray, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ PByteArray. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ этот Ρ‚ΠΈΠΏ (Ρ‚ΠΎΡ‡Π½Π΅Π΅ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΈΠΏ) ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ любой Π½Π΅Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, содСрТащийся Π² Π±ΡƒΡ„Π΅Ρ€Π΅, Π² массив Π±Π°ΠΉΡ‚ΠΎΠ². Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ массивов: массив элСмСнтов Ρ‚ΠΈΠΏΠΎΠ² longint, word ΠΈ Ρ‚.Π΄.

НаиболСС ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ являСтся созданиС класса массива, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ количСство элСмСнтов, ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΈ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ значСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов ΠΈ Π΄Π°ΠΆΠ΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ количСство элСмСнтов Π² массивС. Π”Ρ€ΡƒΠ³ΠΈΠ΅ возмоТности, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сортировка, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈ вставка, Ρ‚ΠΎΠΆΠ΅ Π±Ρ‹Π»ΠΈ Π±Ρ‹ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‡Π΅Π½ΡŒ кстати. ЀактичСски, программист создавал Π±Ρ‹ экзСмпляр класса, объявляя Π² конструкторС Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта, Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ памяти ΠΏΠΎΠ΄ элСмСнты занимался Π±Ρ‹ сам класс.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ здСсь Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π½Π΅ ΠΎ классС TList.TList, ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ вскорС ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ, прСдставляСт собой массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ. По сути, ΠΏΡ€ΠΈ использовании массива TList ΠΏΠ°ΠΌΡΡ‚ΡŒ для размСщСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ элСмСнта выдСляСтся ΠΈΠ· ΠΊΡƒΡ‡ΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΊΠΎΠ΄ просто ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ указатСлями Π½Π° элСмСнты.

ВмСсто этого Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим структурный Ρ‚ΠΈΠΏ массива, TtdRecordList, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ функциям Π±Ρ‹Π» Π±Ρ‹ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ классу TList, Π½ΠΎ выдСлял ΠΏΠ°ΠΌΡΡ‚ΡŒ для самих элСмСнтов. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Ρ‚Π°ΠΊΠΎΠ³ΠΎ класса ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 2.1.

Если Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с интСрфСйсом класса TList, Ρ‚ΠΎ навСрняка ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ класс TtdRecordList содСрТит всС Ρ‚Π΅ ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ свойства, Ρ‡Ρ‚ΠΎ ΠΈ TList. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠ΅Ρ‚ΠΎΠ΄ Add Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π² ΠΊΠΎΠ½Π΅Ρ† списка, a Insert - Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π² список Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ индСксом. Оба ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΡ€ΠΈ нСобходимости Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ структуры массива, ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ счСтчик элСмСнтов. ΠœΠ΅Ρ‚ΠΎΠ΄ Sort Π² этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ. ОписаниС Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π² Π³Π»Π°Π²Π΅ 5.