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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 101

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

β–‘ Π”ля Π΄Π΅Π½Π΅ΠΆΠ½Ρ‹Ρ… расчСтов слСдуСт Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Currency, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ число с фиксированной, Π° Π½Π΅ ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ, дСсятичной Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ. ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ Ρ‚Π°ΠΊΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ слСдуСт ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½Π΅Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ прСдставлСния числа (0,100000001490116 вмСсто 0,1) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ RoundTo, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эта функция Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π±ΠΎΜΠ»ΡŒΡˆΡƒΡŽ, Ρ‡Π΅ΠΌ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ прСдставлСния вСщСствСнных чисСл.

3.3. Вонкости Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ тонкости Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ компилятор ΠΏΡ€ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, казалось Π±Ρ‹, элСмСнтарных дСйствиях. НС всС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ здСсь ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ этот ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ Π³Π»Π°Π²Ρ‹. Но "ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ" здСсь ΠΌΡ‹ Ρ‚ΠΎΠΆΠ΅ встрСтим.

3.3.1. Π’ΠΈΠ΄Ρ‹ строк Π² Delphi

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ ANSI Π² Delphi сущСствуСт Ρ‚Ρ€ΠΈ Π²ΠΈΠ΄Π° строк: AnsiString, ShortString ΠΈ PChar. Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² способС хранСния строки, Π° Ρ‚Π°ΠΊΠΆΠ΅ выдСлСния ΠΈ освобоТдСния памяти для Π½Π΅Π΅. Π—Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ слово string ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ AnsiString, Π½ΠΎ Ссли послС Π½Π΅Π΅ слСдуСт число Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках, Ρ‚ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ ShortString, Π° число β€” ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ Π΄Π»ΠΈΠ½Π΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, сущСствуСт опция компилятора Huge strings (управляСтся Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ компилятора {$H+/-} ΠΈ {$LONGSTRINGS ON/OFF}, которая ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π°, Π½ΠΎ Ссли Π΅Π΅ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ, Ρ‚ΠΎ слово string станСт эквивалСнтно ShortString; ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ ΠΆΠ΅ самоС, string[255]. Π­Ρ‚Π° опция Π²Π²Π΅Π΄Π΅Π½Π° для ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости с Turbo Pascal, Π² Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π΅Π΅ Π½Π΅Ρ‚ Π½ΡƒΠΆΠ΄Ρ‹. Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ устройство этих Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ рис. 3.2.

Рис. 3.2. Устройство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… строковых Ρ‚ΠΈΠΏΠΎΠ² Delphi


НаиболСС просто устроСн Ρ‚ΠΈΠΏ ShortString. Π­Ρ‚ΠΎ массив символов с индСксами ΠΎΡ‚ 0 Π΄ΠΎ N, Π³Π΄Π΅ N β€” число символов, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈ объявлСнии ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Π² случаС использования ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ShortString N явно Π½Π΅ указываСтся ΠΈ Ρ€Π°Π²Π½ΠΎ 255). НулСвой элСмСнт массива Ρ…Ρ€Π°Π½ΠΈΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ строки, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ мСньшС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½Π° объявлСнной (эту Π΄Π»ΠΈΠ½Ρƒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π΄Π°Π»Π΅Π΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ M), элСмСнты с индСксами ΠΎΡ‚ 1 Π΄ΠΎ M β€” это символы, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ строку. ЗначСния элСмСнтов с индСксами M+1..N Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹. ВсС стандартныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ эти символы. Π’ памяти такая пСрСмСнная всСгда Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ N+1 Π±Π°ΠΉΡ‚ΠΎΠ².

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ Ρ‚ΠΈΠΏΠ° ShortString ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹: Π½Π° Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Ρ‹ отводится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚, поэтому такая строка Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ большС 255 символов. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊΠΎΠΉ способ записи Π΄Π»ΠΈΠ½Ρ‹ Π½Π΅ совпадаСт с принятым Π² Windows, поэтому ShortString нСсовмСстим с систСмными строками.

Π’ систСмС приняты Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π½ΡƒΠ»ΡŒ-Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ строки: строка пСрСдаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° Π΅Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ, Π΄Π»ΠΈΠ½Π° строки ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Π½ΠΈΠ³Π΄Π΅ Π½Π΅ хранится, ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ ΠΊΠΎΠ½Ρ†Π° строки считаСтся Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΠ²ΡˆΠΈΠΉΡΡ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ символов #0. Π”Π»ΠΈΠ½Π° Ρ‚Π°ΠΊΠΈΡ… строк ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ доступной ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ способом адрСсации (Ρ‚.Π΅. Π² Windows тСорСтичСски это 4 294 967 295 символов). Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ‚Π°ΠΊΠΈΠΌΠΈ строками прСдусмотрСн Ρ‚ΠΈΠΏ PChar. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ строки. Π’ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ PChar = ^Π‘har, ΠΎΠ΄Π½Π°ΠΊΠΎ это Π½Π΅Π²Π΅Ρ€Π½ΠΎ: Ρ‚ΠΈΠΏ PChar встроСн Π² компилятор ΠΈ Π½Π΅ выводится ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ². Π­Ρ‚ΠΎ позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ с Π½ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, нСдопустимыС для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ссли P β€” пСрСмСнная Ρ‚ΠΈΠΏΠ° PChar, Ρ‚ΠΎ допустимо ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ символам строки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструкции P[N], Π³Π΄Π΅ N β€” цСлочислСнноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π΅ Π½ΠΎΠΌΠ΅Ρ€ символа (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ShortString, здСсь символы Π½ΡƒΠΌΠ΅Ρ€ΡƒΡŽΡ‚ΡΡ с 0, Π° Π½Π΅ с 1). Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΊ указатСлям Ρ‚ΠΈΠΏΠ° PChar Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹Π΅ числа, смСщая ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ число Π±Π°ΠΉΡ‚ΠΎΠ² Π²Π²Π΅Ρ€Ρ… ΠΈΠ»ΠΈ Π²Π½ΠΈΠ· (здСсь Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ± ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… "+" ΠΈ "-"; адрСсная Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ Inc ΠΈ Dec доступна для Π»ΡŽΠ±Ρ‹Ρ… Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для PChar).

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с PChar программист Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для строки ΠΈ Π·Π° Π΅Π΅ освобоТдСниС. ИмСнно это ΠΈ слуТит основным источником ошибок Ρƒ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²: ΠΎΠ½ΠΈ ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚Π°ΠΊΠΈΠΌΠΈ строками Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ с AnsiString, надСясь, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ автоматичСски. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ грубая ошибка, способная привСсти ΠΊ самым нСпрСдсказуСмым послСдствиям.

Π₯отя программист ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠ»Π½ΡƒΡŽ свободу Π²Ρ‹Π±ΠΎΡ€Π° Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ для Π½ΡƒΠ»ΡŒ-Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… строк, Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв самыми ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для этого Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ StrNew, StrDispose ΠΈ Ρ‚.ΠΏ. Π˜Ρ… прСимущСство Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ памяти выдСляСт Ρ‡ΡƒΡ‚ΡŒ большС мСста, Ρ‡Π΅ΠΌ трСбуСтся для хранСния строки, ΠΈ Π² эту Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ записываСтся, сколько Π±Π°ΠΉΡ‚ΠΎΠ² Π±Ρ‹Π»ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ. Благодаря этому функция StrDispose удаляСт Ρ€ΠΎΠ²Π½ΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ памяти, сколько Π±Ρ‹Π»ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ, Π΄Π°ΠΆΠ΅ Ссли Π² сСрСдину Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π±Ρ‹Π» записан символ #0, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°ΡŽΡ‰ΠΈΠΉ Π΄Π»ΠΈΠ½Ρƒ строки.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Ρ‚Π°ΠΊΠΆΠ΅ позволяСт Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ статичСскиС массивы Ρ‚ΠΈΠΏΠ° Char, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ индСкса, ΠΊΠ°ΠΊ Π½ΡƒΠ»ΡŒ-Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ строки. Π’Π°ΠΊΠΈΠ΅ массивы совмСстимы с Ρ‚ΠΈΠΏΠΎΠΌ PChar, Ρ‡Ρ‚ΠΎ позволяСт ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· использования динамичСской памяти ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ со строками.

Π’ΠΈΠΏ AnsiString ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ достоинства Ρ‚ΠΈΠΏΠΎΠ² ShortString ΠΈ PChar: строки ΠΈΠΌΠ΅ΡŽΡ‚ фактичСски Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ, Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ памяти для Π½ΠΈΡ… Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, Π² ΠΈΡ… ΠΊΠΎΠ½Π΅Ρ† автоматичСски добавляСтся символ #0, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΡ… совмСстимыми с систСмными строками (Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, эта ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ Π½Π΅ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Π°Ρ; ΠΊΠ°ΠΊ ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ AnsiString Π² функциях API, ΠΌΡ‹ рассматривали Π² Ρ€Π°Π·Π΄. 1.1.13.).

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Ρ‚ΠΈΠΏΠ° AnsiString β€” это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ строки, ΠΊΠ°ΠΊ ΠΈ Π² случаС PChar. Π Π°Π·Π½ΠΈΡ†Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ этой строкой Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ записываСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация: Π΄Π»ΠΈΠ½Π° строки ΠΈ счСтчик ссылок. Π­Ρ‚ΠΎ позволяСт компилятору Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, автоматичСски Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ, ΠΏΠ΅Ρ€Π΅Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΠ²ΡˆΠΈΠΉ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π²Ρ‹Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ для строки. Π Π°Π±ΠΎΡ‚Π° с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ происходит ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ для программиста, Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв со строками AnsiString ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡΡΡŒ ΠΎΠ± ΠΈΡ… Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ устройствС. Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ Π² Ρ‚Π°ΠΊΠΈΡ… строках Π½ΡƒΠΌΠ΅Ρ€ΡƒΡŽΡ‚ΡΡ с Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ пСрСнос старых ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π²ΡˆΠΈΡ… строки Ρ‚ΠΈΠΏΠ° ShortString.

Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ ссылок позволяСт Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ называСтся copy-on-demand, ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ нСобходимости. Если Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ S1, S2 Ρ‚ΠΈΠΏΠ° AnsiString, присваиваниС Π²ΠΈΠ΄Π° S1 := S2 Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ всСй строки. ВмСсто этого Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ S1 копируСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ указатСля S2, Π° счСтчик ссылок строки увСличиваСтся Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Π’ дальнСйшСм, Ссли ΠΎΠ΄Π½Ρƒ ΠΈΠ· этих строк потрСбуСтся ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΎΠ½Π° сначала Π±ΡƒΠ΄Π΅Ρ‚ скопирована (Π° счСтчик ссылок ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π°, СстСствСнно, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½) ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это Π½Π΅ Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π»ΠΎ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΈ использовании строк Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°.

3.3.2. Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ строковых Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ²

Π›ΠΈΡ‚Π΅Ρ€Π°Π»Π°ΠΌΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ значСния, записываСмыС Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ. Π’ частности, строковыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Π² Delphi β€” это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ ΠΈΠ»ΠΈ записанных Π² Π²ΠΈΠ΄Π΅ ANSI-ΠΊΠΎΠ΄ΠΎΠ² с использованиСм прСфикса #.

Когда Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ встрСчаСтся строковый Π»ΠΈΡ‚Π΅Ρ€Π°Π», ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ стало доступным ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Delphi Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ строковыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Π² сСгмСнтС ΠΊΠΎΠ΄Π°, Π² участках, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ пСрСдаСтся. Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим, ΠΊ ΠΊΠ°ΠΊΠΈΠΌ послСдствиям это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти.

ПолоТим Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ ΠΏΡΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΈ напишСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ для наТатия Π½Π° Π½ΠΈΡ… (листинг 3.17, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Constants Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС).

Листинг 3.17. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строковыми Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°ΠΌΠΈ

procedure TForm1.Button1Click(Sender: TObject);

var

 P: PChar;

begin

 P := 'Xest';

 P[0] := 'T'; { * }

 Label1.Caption := P;

end;


procedure TForm1.Buttom2Click(Sender: TObject);

var

 S: string;

 P: PChar;

begin

 S:= 'Xest';

 P := PChar(S);

 P[0] := 'T'; { * }

 Label1.Caption := P;

end;


procedure TForm1.Button3Click(Sender: TObject);

var

 S: string;

begin

 S := 'Xest';

 S[1] := 'T';

 Label1.Caption := S;

end;


procedure TForm1.Button4Click(Sender: TObject);