Delphi

Delphi длина строки: Строки в Delphi, или Жестокие игры со словами » DelphiComponent.ru

Строки Delphi

Строки Delphi можно представить несколькими типами: Longstring, widestring и shortstring. Основные различия данных типов состоит в предельно допустимой длине строки, способе выделения памяти для переменных и способе кодировки символов.

Для переменной с типом shortstring память выделяется еще до начала выполнения основной программы, а длина такой строки не может превышать значения 255 (число символов). Для переменных с типом данных Longstring иwidestring память выделяется не перед началом, а в процессе работы программы, вследствие этого такие строки могут иметь практически не ограниченную длину.

Кроме вышеупомянутых строковых типов следует использовать еще один достаточно универсальный строковый тип данных String, эквивалентный типу данных Shortstring. Как в случае символьного типа, переменную со строковым типом данных необходимо объявить в разделе var. При этом инструкция объявления строки Delphi представляется в следующем виде:

name: string; 

либо

name: string [long];

откуда:

name — выступает в качестве имени переменной;

string – специальное ключевое слово, обозначающее строковый тип;

long – константа с целым типом данных, задающая максимальную возможную длину строки.

Примеры объявления строки Delphi:

s: string; st: string [55];

В первом примере, как мы видим, не указана длина строки, поэтому ее длину следует считать равной 255 символам:

s: string;  

или

s: string [255];

Данные объявления строковых переменных эквивалентны друг другу. Если в исходном коде программы вы хотите указать строку (строковую константу), представляющую собой последовательность символов, необходимо заключить строку в одинарные кавычки. К примеру, для присвоения переменной строкового типа name некоторого значения, следует записать:

password:= ‘taina’; 

либо

password:= ‘1234’;

Обратите внимание, что инструкция объявления

password:= 1234;

некорректная, поскольку возникает не соответствие типа константы и типа переменной. В процессе компиляции данной инструкции выведется специальное сообщение:

incompatible types: ‘Char’ and ‘Integer’

что означает несовместимость типов данных Char и Integer; При помощи операций

=,   <,   >,   <=,   >=

возможно сравнение одной переменной типа string с другой переменной строкового типа string, либо со строковой константой. При этом сравнение указанных строк проходит по каждому символу, начиная с первого. В случае, если в состав строк входят абсолютно одинаковые символы, то такие строки равны. Если на одной и той же позиции в обеих строках расположены различные символы, то большей строкой считается та, в которой на данной позиции присутствует символ, имеющий больший код. Ниже приведена таблица с примерами сравнения строк.

  1. str1=’Леонов’, str1=’Леонов’ — строки равны
  2. str1=’Леонова’, str1=’Леонов’ — str1 больше str2
  3. str1=’Леонов’, str1=’Леонова’ — str1 меньше str2

Над строками Delphi применима операция сложения, в результате которой образуется новая строка. К примеру, при выполнении следующих инструкций:

im:= ‘Lera  ‘; 

fam:= ‘Ivanova’; 

fi:= im + fam;

переменной fio будет присвоено значение ‘Lera Ivanova‘.


Похожие записи:
  • Оператор goto Delphi
  • Ввод из файла Delphi
  • Константы Delphi
  • Цикл case Delphi
  • Условия Delphi
Delphi

3.

3.1. Виды строк в Delphi. О чём не пишут в книгах по Delphi

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. С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, а счетчик ссылок строки увеличивается на единицу.

В дальнейшем, если одну из этих строк потребуется модифицировать, она сначала будет скопирована (а счетчик ссылок оригинала, естественно, уменьшен) и только потом изменена, чтобы это не затрагивало остальные переменные.

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

Данный текст является ознакомительным фрагментом.

1.3.3. Delphi и CGI

1.3.3. Delphi и CGI В данной главе я расскажу, как написать простое Дельфи CGI приложение, без использования Web Modules или других Client/Server модулей.Во первых аббревиатура CGI означает Common Gateway Interface, и это только имя для передачи информации от клиента серверу. На клиентской стороне это

2.

1.1. Delphi и HTML

2.1.1. Delphi и HTML Мой главный инструмент разработчики это Дельфи, и мы напишем Delphi Database HTML Expert в данной главе. Дельфи позволяет подсоединяться практически к базе данных любого формата. С помощью BDE к Парадоксу и dBASE, с помощью ODBC например к Access, и с помощью SQL Links к большим DBMS типа

Вопросы по Delphi 2.0

Вопросы по Delphi 2.0 Что нового в Delphi 2.0 по сравнения с Delphi 1.0? Выпущенная в феврале 1995 года версия Delphi 1.0 стала первым инструментом для Windows, комбинирующим оптимизирующий компилятор, механизмы визуальной разработки Two-Way-Tools и масштабируемую архитектуру обработки баз данных. 

Что нового в Delphi 2.0 по сравнения с Delphi 1.0?

Что нового в Delphi 2.0 по сравнения с Delphi 1.0? Выпущенная в феврале 1995 года версия Delphi 1. 0 стала первым инструментом для Windows, комбинирующим оптимизирующий компилятор, механизмы визуальной разработки Two-Way-Tools и масштабируемую архитектуру обработки баз данных.  Сегодня сотни

Глава 1 Windows API и Delphi

Глава 1 Windows API и Delphi Библиотека VCL, делающая создание приложений в Delphi таким быстрым и удобным, все же не позволяет разработчику задействовать все возможности операционной системы. Полный доступ к ним дает API (Application Programming Interface) — интерфейс, который система предоставляет

3.2.2. Вещественные типы Delphi

3.2.2. Вещественные типы Delphi В Delphi существует четыре вещественных типа: Single, Double, Extended и Real. Их общий формат одинаков (рис. 3.1, а).Знак — это всегда один бит. Он равен нулю для положительных чисел и единице для отрицательных. Что же касается размеров мантиссы и экспоненты, то

Глава 1.

Что нового в Delphi 4

Глава 1. Что нового в Delphi 4 Delphi 4 представляет следующие новые свойства и усовершенствования:Новые расширения языка.Delphi 4 в язык Object Pascal включены динамические массивы, методы обработки переполнения, установка значения параметров по умолчанию, и многое другое.Менеджер

Разработчик Delphi

Разработчик Delphi Русскоязычные N Сервер Описание 1 http://www.inprise.ru Российское представительство Inprise Фирма – разработчик

9.3. Использование OLE в Delphi

9.3. Использование OLE в Delphi Как и многие современные среды программирования, Delphi поддерживает возможность автоматизированной разработки приложений, работающих с различными СОМ-сервисами или серверами. Для более глубокого понимания принципов работы приложений,

массивов.

Как работает функция Length() в Delphi?

спросил

Изменено 12 лет, 3 месяца назад

Просмотрено 6к раз

  • В других языках, таких как C++, вы должны сами отслеживать длину массива — откуда Delphi узнает длину моего массива? Существует ли внутреннее скрытое целое число?

  • Не лучше ли для критичных к производительности частей использовать не Length(), а прямое целое число, управляемое мной?

  • массивы
  • delphi

Существует три типа массивов, и длина работает по-разному для каждого:

  • Динамические массивы : Они реализованы как указатели. Указатель указывает на первый элемент массива, но «за» этим элементом (с отрицательным смещением от начала массива) находятся два дополнительных целочисленных значения, которые представляют длину массива и количество ссылок. Длина считывает это значение. Это то же самое, что и для строки типа .

  • Статические массивы : компилятору известна длина массива, поэтому Длина является константой времени компиляции.

  • Открытые массивы : Длина параметра открытого массива передается как отдельный параметр. Компилятор знает, где найти этот параметр, поэтому он заменяет Length на чтение значения этого параметра.

2

Не забывайте, что расположение динамических массивов и тому подобное изменится в 64-битной версии Delphi, поэтому любой код, основанный на нахождении длины по определенному смещению, будет ломаться.

Я советую просто использовать Length() . Если вы работаете с ним в цикле, вы можете закэшировать его, но не забывайте, что цикл для уже кэширует конечные границы цикла.

Да, на самом деле есть два дополнительных поля с динамическими массивами. Во-первых, это количество элементов в массиве со смещением -4 байта к первому элементу, а со смещением -8 байтов — счетчик ссылок. См. статью Руди для подробного объяснения.

Для второго вопроса вам придется использовать SetLength для определения размера динамических массивов, поэтому внутреннее поле «длина» в любом случае будет доступно. Я не вижу особого смысла в дополнительном отслеживании размера.

Поскольку Роб Кеннеди дал такой хороший ответ на первую часть вашего вопроса, я просто обращусь ко второй:

Не лучше ли для критичных к производительности частей использовать не Length(), а прямое целое число, управляемое мной?

Абсолютно нет. Во-первых, как упомянул Роб, компилятор делает все возможное для очень быстрого доступа к информации, либо считывая фиксированное смещение перед началом массива в случае динамических, либо используя константу времени компиляции в случае статических, и передавая скрытый параметр в случае открытых массивов, вы не получите никакого улучшения производительности.

Во-вторых, прямое целое, управляемое вами, не будет быстрее, но на самом деле потребует больше памяти (дополнительное целое, выделенное вместе с тем, которое Delphi уже предоставляет для динамических и открытых массивов, и дополнительное целое целиком в случае статические массивы).

Даже если вы напрямую прочитаете значение, которое Delphi уже хранит для динамических массивов, вы не получите никакой производительности по сравнению с Length() и рискуете сломать свой код, если внутреннее представление этого скрытого заголовка для массивов изменится в будущем.

Есть ли внутреннее скрытое целое число

Да.

, чтобы не использовать Length(), а прямое целое число, которым я управляю?

Неважно.

См. пункт «Динамические массивы» в статье «Адресация указателей» Руди Велтуиса.

П.С. Вы также можете нажать кнопку F1.

3

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Delphi AnsiString в строку, Delphi длина строки, основная строка Delphi,

Delphi AnsiString в строку

Переменная AnsiString представляет собой структуру, содержащую строковую информацию. Когда переменная пуста (когда она содержит строку нулевой длины), указатель равен нулю, и строка не использует дополнительное хранилище. Когда переменная не пуста, она указывает на динамически выделенный блок памяти, содержащий строковое значение.

Функция AnsiContainsStr ищет строку Needle в строке Haystack, возвращая true, если находит.

Длина строки Delphi

Описание Функция Length возвращает либо количество символов в SourceString, либо количество элементов в SourceArray. Он часто используется для циклического обхода всех символов в строке или элементов массива.

Длина возвращает количество элементов в строке или массиве. Это не настоящая функция.

Описание: cПроцедура SetLength изменяет размер строки, одномерного динамического массива или многомерного динамического массива. Версия 1 При изменении размера строки StringToChange новый размер NewLength может быть меньше, таким же или больше, чем у существующей строки.

Описание Процедура SetString устанавливает длину TargetString в Length перед копированием этого количества символов из буфера, на который ссылается BufferPointer. Длина устанавливается только в том случае, если строка не является ShortString. Фактически, строка перераспределяется — ссылка TargetString затем устанавливается так, чтобы она указывала на эту новую строку.

Если Index больше длины S, Copy возвращает строку нулевой длины («») или пустой массив. Если Count указывает больше символов или элементов массива, чем доступно, возвращаются только символы или элементы от S[Index] до конца S.

Основы Delphi string

Тип данных String используется для хранения последовательностей символов, таких как предложения. Строка по умолчанию фактически обрабатывается как AnsiString. Его можно рассматривать как ShortString, если директива компилятора $LongStrings отключена (по умолчанию включена). AnsiChar может содержать любое количество символов, ограниченное только памятью.

Функция StringReplace заменяет первое или все вхождения подстроки OldPattern в SourceString на NewPattern в соответствии с параметрами Flags. Измененная строка возвращается.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *