Главная » Delphi » Строка типа PChar

0

Если вы усвоите сказанное в предыдущем абзаце, то у вас не будет проблем со строками pchar в Delphi (см. также примечание на этот счет в главе 14), которые есть ни что иное, как С-указатель на символ (а именно, на самый первый в строке символ с номером 0), его определение и выглядит так: pchar = ‘char. Идея, легшая в основу ASCIIZ-строк, была проста: видимо, когда памяти у компьютеров было мало, объем программ исчислялся байтами, и программист мог удержать в голове, что и где у него располагается (см. эпиграф), возникла мысль хранить строковые данные так, чтобы вообще не надо было знать, сколько они места занимают. Просто считываешь до первого встреченного нуля, и все. Не знаю, гак ли это на самом деле, только в современных условиях за памятью все равно приходится следить. Но язык С весь построен на идее указателей’, так что в любых языках, основанных на его синтаксисе, все строки являются нуль-терминированными.

Мы уже неоднократно отмечали различные сложности и ограничения при работе с типом PChar. Безоговорочно его использовать можно только, если он изначально создается именно как PChar, иначе замыкающего нулевого символа может и не оказаться. Или вот еще пример кода, который выглядит корректным, но выдаст знакомую ошибку "Access Violation":

function IntToPChar (n -.Integer) :pChar;

var st:String;

begin

st:=IntToStr(n); Result:=PChar(st); end;

ShowMessage(IntToPChar(100)); ("Access Violation . . .")

Здесь строка st в момент выхода из функции уничтожается, и ссылка на нее становится указывающей в никуда. В данном случае достаточно st объявить глобальной переменной, но все равно могут быть и другие ошибки, по этому поводу см., например, [39]. И— реплика в сторону— оцените, насколько удобнее работать с паскапевскими строками: хотя нуль-терминированные строки вроде бы гибче, но правильное их использование требует от программиста гораздо более высокой квалификации. Низкий наш поклон Никлаусу Вирту!

pchar— единственный тип указателей в языке Pascal, с которым, как и в С, можно выполнять арифметические операции. Например, в результате следующего фрагмента кода:

pst,pch:PChar;

pst:=’vasya'; pch:=pst+l;

вы получите pch = ‘asya’. При простом переборе в цикле значений pst от О до 4 вы получите указатели поочередно на все символы строки. Поэтому в принципе использовать строку типа pchar, как массив с произвольным доступом, было бы очень удобно, но все портит особое значение нулевого символа, как конца строки. В результате присваивания pst^’vas’+MO+’ya’ вы получите, к сожалению, только строку ‘vas’, остальное пропадет. Так как мы считаем, что в потоке данных могут содержаться любые коды символов, то этот способ нам в общем случае не подойдет.

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

По теме:

  • Комментарии