Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Представление строк 
:(
    Опции темы
Sasha
Дата 2.10.2002, 00:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ребята объясните как храняться во внутреннем формате строки.
1) Как хрянятся строки типа String в Паскале;
2) Как хранятся строки типа PChar тоесть с нулевым символом в конце.
Например:
Я задаю строку: <<йцукйцукцйукцу>>
Как эта строка будет выглядеть в двоичной системе счисления ?
Перевод каждого символа в двоичную систему счисления, это не правильный ответ.
  Вверх
Vit
Дата 2.10.2002, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Тип String:

по смещению  -2  храниться длина строки
по смещению  -4  храниться счётчик ссылок на строку (когда он обнуляется строка уничтожается)

Сама строка располагается в памяти как есть - каждая буква занимает 1 байт.

При копировании строки:

s1:=s2 - реального копирования не происходит, увеличивается только счётчик ссылок, но если после этого изменить одну из строк:

s1:=s1+'a';

то произойдёт физическое копирование содержимого строк, и теперь s1 и s2 будут показывать на разные адреса памяти.


PChar - длина строки определяется от начала до #0 байта, по сути это чистой воды pointer, так что все действия по отслеживанию распределения памяти лежат на программисте - сами заботьтесь о том чтобы хватило места для распределения памяти и освобождении после использования. Тоже одна буква = 1 байт

Для хранения unicode (т.е. 2х байтовых символов) используйте соответствующие символы с приставкой Wide...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 2.10.2002, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Поправка!

Цитата
по смещению  -2  храниться длина строки
по смещению  -4  храниться счётчик ссылок на строку (когда он обнуляется строка уничтожается)


Пожалуй, это процессозависимо и скорее всего sizeof(Cardinal). У меня эти смещения -4 и -8 соответственно. Причем, если переменная string объявлена локально в процедуре, то счетчик ссылок на нее не храниться  - она освобождается при выходе из процедуры.

Цитата
s1:=s2 - реального копирования не происходит, увеличивается только счётчик ссылок


Это тоже верно только если s1 - локальная переменная, или s1 и s2 - обе не локальные. Если s1 не локальная(глобальная или член класса), а s2 - локальная происходит копирование.

Все это верно для Delphi6 про другие версии утверждать не буду.

P.S. Я бы вообще в это дело не полез, только я когда-то раньше делал дамп строки, и не видел там никакого счетчика(теперь понимаю почему), а по смещению -4 была длина. Это все я и впаривал усердно народу. А теперь, тут такое заявление - пришлось глянуть по внимательнее.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Fantasist
Дата 2.10.2002, 06:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Кстати тут в Delphi6 у меня глюк нашелся с функцией StrAlloc - котороя  выделяет память под строку и возвращает PChar. Это очевидно, если глянуть в исходник:

Код

function StrAlloc(Size: Cardinal): PChar;
begin
 Inc(Size, SizeOf(Cardinal));
 GetMem(Result, Size);
 Cardinal(Pointer(Result)^) := Size;
 Inc(Result, SizeOf(Cardinal));
end;


Как видно, выделяется память размером Size+SizeOf(Cardinal) , и в первые(предшествующие) четыре байта (у меня SizeOf(Cardinal)=4) записывается Size. Только, видно они забыли, что Size перед этим был увеличен на sizeof(Cardinal).
В результате у меня был глюк при преобразовании PChar к String - в String попадали лишние символы.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Vit
Дата 2.10.2002, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Цитата(Fantasist @ 01.10.2002, 14:04)
Пожалуй, это процессозависимо и скорее всего sizeof(Cardinal). У меня эти смещения -4 и -8 соответственно.

Сорри, бес попутал! Конечно -4 и -8...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.