Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
ВнизКак получить String имея указатель и длину ? Найти похожие ветки
← →
Vlad (2004-02-11 11:42) [0]Добрый день.
Есть процедура:
MyProc(Ptr, Len: Integer);
где Ptr - указатель на строку в виде Integer,
Len - длина строки.
Подскажите, как получить всю строку заданной длины, учитывая что в ней могут встречаться null-terminator"ы ?
Заранее спасибо.
← →
Sandman25 (2004-02-11 11:44) [1]Зачем?
String не предназначен для хранения #0.
← →
alex_*** (2004-02-11 11:46) [2]Выделяешь память под строку и делаешь Copy в нее
← →
Amoeba + PVOzerski (2004-02-11 11:50) [3]>где Ptr - указатель на строку в виде Integer,
Это как? Указатель - это указатель (его, конечно, можно привести к типу integer...), а строки - они разные бывают... ShortString, AnsiString, WideString, pChar, наконец... И рецепты будут разные тоже.
← →
Vlad (2004-02-11 11:55) [4]
> Amoeba + PVOzerski (11.02.04 11:50) [3]
Фактически это PChar приведенный к Integer
← →
Amoeba (2004-02-11 12:03) [5]
> в ней могут встречаться null-terminator"ы
Строка заканчинается на первом #0. То, что следует за ним, уже к строке отношения не имеет.
Могу посоветовать рассматривать твою "строку" как байтовый массив и парсить его на строки. Или как вариант заменить все #0 кроме, естественно последнего, на к примеру #32 (пробел).
← →
Anatoly Podgoretsky (2004-02-11 12:05) [6]Vlad © (11.02.04 11:55) [4]
Ну а ты приведи к PChar :-)
← →
Vlad (2004-02-11 12:24) [7]Да, я уже понял, что при приведении к типу string все что сделует за #0 по любому отсекается.
Просто мне была некорректно поставлена задача - получить string заданной длины учитывая что в нем могут встречаться #0, что само по себе, как выяснилось - глупость :-)
← →
MBo (2004-02-11 12:37) [8]SetString(s,PChar(Ptr),Len);
нули не помешают.
← →
Amoeba (2004-02-11 12:41) [9]
> нули не помешают
Только вот если такую "строку" надо визуализировать, то все, что за первым #0 будет отсечено.
← →
Vlad (2004-02-11 12:53) [10]Да, я уже понял что все равно работать с такой строкой можно будет только как с набором байтов, а визуализировать целиком не получится. Спасибо что восполнили пробел в моих знаниях :-)
← →
Anatoly Podgoretsky (2004-02-11 13:01) [11]Можно и визуализировать, но придется ручки прикладывать
← →
PVOzerski (2004-02-11 13:02) [12]>Можно и визуализировать, но придется ручки прикладывать
Например, заменить все #0 на #32.
← →
Amoeba (2004-02-11 13:16) [13]
> >Можно и визуализировать, но придется ручки прикладывать
> Например, заменить все #0 на #32.
Это уже предложено в
> Amoeba © (11.02.04 12:03) [5]
← →
Vlad (2004-02-11 13:31) [14]Я вот тут что-то совсем запутался с типом string (позор на мою голову)
Вот PChar на сколько я понимаю, это указатель на первый байт строки в памяти. А string, я где-то читал, тоже сам по себе является указателем. Но только на что ? Т.е. я просто пытаюсь понять связь между типами string и PChar. (просьба сильно не пинать, это действительно пробел в моих знаниях)
← →
MBo (2004-02-11 13:38) [15]>является указателем. Но только на что
Указатель на первый символ строки.
В конце ее добавляется нуль для совместимости с PChar.
Перед телом строки лежит информационный блок из 3 Integer, хранящих длину строки, счетчик ссылок и общий размер структуры.
← →
Amoeba (2004-02-11 13:43) [16]string - это указатель на масссив байтов в памяти. Но только не на начальный байт (точно не помню на какой по счету). В байтах, предшестующих тому, на который указывает указатель находится грубо говоря "служебная информация" о строке (в частности, количество ссылок на нее). Последний байт строки - #0.
← →
Тимохов (2004-02-11 13:45) [17]
> Перед телом строки лежит информационный блок из 3 Integer,
> хранящих длину строки, счетчик ссылок и общий размер структуры.
А не из 2?
← →
Vlad (2004-02-11 13:45) [18]
> MBo © (11.02.04 13:38) [15]
Т.е. если я правильно понял, то сначала идут 12 байт информационных, а 13-й -как раз тот байт на который ссылается данный указатель ?
Кстати, а что такое счетчик ссылок ?
← →
Тимохов (2004-02-11 13:46) [19]
> Т.е. если я правильно понял, то сначала идут 12 байт
Откуда 12?
Выдержка их хелпа
Offset Contents
–8 32-bit reference-count
–4 length in bytes
0..Length – 1 character string
Length NULL character
← →
Anatoly Podgoretsky (2004-02-11 13:48) [20]Vlad © (11.02.04 13:31) [14]
Правильнее думать, что PChar является указателем или на символ или на буфер, массив символов, при этом действует некотрая договоренность, что строки заканчиваются символом нуля.
string же является указателем на структуру, которая зранит точное значение строки, поэтому отсутствует ограничение.
string полностью совместим с PChar, когда мы говорим о нем, как о массиве символов занакнчивающей нулем
← →
Anatoly Podgoretsky (2004-02-11 13:49) [21]Тимохов © (11.02.04 13:46) [19]
Ссылку на версию Дельфи и название темы, но это информация неверная.
← →
Anatoly Podgoretsky (2004-02-11 13:50) [22]MBo © (11.02.04 13:38) [15]
Поправка - размер распределенной памяти
← →
Владислав (2004-02-11 13:52) [23]> Anatoly Podgoretsky © (11.02.04 13:49) [21]
Для D6 вполне достоверно (если константные строки не рассматривать).
← →
Vlad (2004-02-11 13:53) [24]
> Anatoly Podgoretsky © (11.02.04 13:48) [20]
> Правильнее думать, что PChar является указателем или на
> символ или на буфер, массив символов, при этом действует
> некотрая договоренность, что строки заканчиваются символом
> нуля.
Насчет PChar вопросов нет, тут вроде понятно.
А вот поясните, что такое счетчик ссылок ? Как он работает ?
← →
MBo (2004-02-11 13:57) [25]>сначала идут 12 байт информационных, а 13-й -как раз тот байт
Да, это первый символ строки, S[1], и именно на него указывает указатель-переменная строкового типа.
О служебных полях обычно не стоит заботиться, а также использовать их напрямую - все же это прерогатива компилятора и RTL.
топик хелпа Long strings
>Тимохов
Это конфиденциальная информация ;)
память под строку выделяется динамически, и менеджер памяти Дельфи хранит перед выделенным блоком его размер.
← →
Владислав (2004-02-11 13:58) [26]Если кратко, при присвоении строки счетчик ссылок увеличивается. При выходе за пределы видимости уменьшается. Как станет нулевым, память, занятая под строку высвобождается. CTRL+ALT+C. Там все наглядно.
← →
Владислав (2004-02-11 14:02) [27]> MBo © (11.02.04 13:57) [25]
Ну дык по большому счету, размер памяти меньше всего относится именно к строкам. Он относится к динамическому выделению памяти вообще. А вот -8 и -4 - это именно строковая вещь (ну или "массивная" :) ).
← →
Anatoly Podgoretsky (2004-02-11 14:15) [28]Vlad © (11.02.04 13:45) [18]
Позволяет упралять распределением памяти, указывает количество обращений к ней, и при значении равным нулю высвобождает память.
Приаер
S1 := "abc" одна ссылка
S2 := S1 две ссылки, S1 и S2 ссылаются на одну и туже строку
S2 := S2 + "DEF"; снова одна ссылка и одна в S1, зато теперь две независимые строки, S1 и S2 ссылаются на две разные строки
S1 := "abc" одна ссылка
S2 := S1 две ссылки, S1 и S2 ссылаются на одну и туже строку
S2 := nil; снова одна ссылка, S1 неприкосновенна
← →
Тимохов (2004-02-11 14:18) [29]
> Anatoly Podgoretsky © (11.02.04 13:49) [21]
> Тимохов © (11.02.04 13:46) [19]
> Ссылку на версию Дельфи и название темы, но это информация
> неверная.
Раздел хелпа
Object Pascal Reference\memory magmament\long string
Delphi 6.
← →
Fay (2004-02-11 14:52) [30]Мне, к примеру, запомнилось, что код SetString() не даёт повода делать предположения о существовании счётчика ссылок. А он есть!
← →
Vlad (2004-02-11 15:05) [31]
> Anatoly Podgoretsky © (11.02.04 14:15) [28]
Большое спасибо за подробное разъяснение!
Спасибо всем, теперь более менее начинаю понимать.
Тут читал о типе WideString, я так понял что у него совершенно иной способ хранения, и, кстати ничего не сказано про счетчик ссылок. В WideString его нет ?
← →
Тимохов (2004-02-11 15:12) [32]
> Тут читал о типе WideString, я так понял что у него совершенно
> иной способ хранения, и, кстати ничего не сказано про счетчик
> ссылок. В WideString его нет ?
Раз не сказано, значит нет...
← →
Владислав (2004-02-11 15:17) [33]Есть. Точно такой же. В D6 (не знаю, как в других) память под строку AnsiString и WideString выделяет одна и та же процедура.
← →
Тимохов (2004-02-11 15:19) [34]
> память под строку AnsiString и WideString выделяет одна
> и та же процедура
Конечно, что-то типа GetMem или на его основе. :))))))
Разве это говорит о наличии счетчика ссылок?
← →
Владислав (2004-02-11 15:21) [35]> Тимохов © (11.02.04 15:19) [34]
А пройтись отладчиком?
← →
Тимохов (2004-02-11 15:23) [36]
> Владислав © (11.02.04 15:21) [35]
Сами пробовали? Какой ответ?
Честно говоря лениво немного.
← →
Владислав (2004-02-11 15:28) [37]Виноват. Ступил. Процедуры разные.
← →
Anatoly Podgoretsky (2004-02-11 15:32) [38]Тимохов © (11.02.04 15:12) [32]
Почему не сказано, вот цитата из справки
However, wide strings are not reference counted.
← →
Тимохов (2004-02-11 15:37) [39]
> However, wide strings are not reference counted.
Значит я не ждедай - я думал я это ПРОСТО знал :((((
Оказывается я это прочел когда-то :))))
Интересно, кстати, почему борланд не стал этого делать?
← →
Vlad (2004-02-11 15:41) [40]
> However, wide strings are not reference counted.
А каким же образом компилятор узнает когда нужно освобождать память ?
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.037 c