Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизPascal String Найти похожие ветки
← →
Chlavik © (2004-12-06 01:14) [0]Скажите пожалуйста строки такого типа Null Terminated ?
т.е. кроме размера строки перед началом там есть еще 0 символ в конце ? Я могу написать что типа
var S:string;
p:PChar;
begin
P:=Pointer(S) вместо PChar потому что при последнем вызывается LStrToPChar ?
← →
Piter © (2004-12-06 01:48) [1]я так и не понял в чем вопрос конкретно...
P:=Pointer(S)
некорректно. И как ты думаешь - куда будет указывать P?
← →
jack128 © (2004-12-06 02:05) [2]в данном конкретном коде - nil. А что некоректного??
Null Terminated строки - это строки, которые закончиваются символом #0.
Chlavik © (06.12.04 1:14)
P:=Pointer(S) вместо PChar потому что при последнем вызывается LStrToPChar ?
Потому что борланду так захотелось. Дело в том, что string не полностью совместимы с PChar. Пустая строка в string хранить как nil, а не как указатель на символ #0, функция LStrToPChar как и проверяет s на nil и, если что , возвращает нужное значение...
← →
Chlavik © (2004-12-06 03:04) [3]
> Piter © (06.12.04 01:48) [1]
На первый символ строки или nil если строка нулевой длины...
Так вы мне так и не сказали есть там нулевой символ или нет ???
← →
GuAV © (2004-12-06 03:06) [4]Если указатель на первый символ строки то есть.
Если указатель nil, то вопрос неуместен :)
← →
Chlavik © (2004-12-06 03:07) [5]Я имею ввиду
var s:string;
begin
s:="Test";
так будет в памяти после последней буквы "t" нулевой символ а то что nil если строка пуста то я и так знаю...
← →
default © (2004-12-06 03:09) [6]Chlavik © (06.12.04 03:07) [5]
БУДЭ
← →
GuAV © (2004-12-06 03:09) [7]Будет.
← →
GuAV © (2004-12-06 03:10) [8]2 default ©
:-)
← →
default © (2004-12-06 03:13) [9][5]
если CPU пользоваться не умеешь, то мог так испытать
if S[Length(S)+1] = #0 then ShowMessage("")
или хелп прочитать
← →
Chlavik © (2004-12-06 03:15) [10]
> default © (06.12.04 03:13) [9]
А кто сказал что там в памяти что до меня было записано - там много нулей - если ты заметил...
← →
default © (2004-12-06 03:18) [11]Chlavik © (06.12.04 03:15) [10]
это конечно так
но если ты знал что такое PChar и передавал String с приведением в PChar в апи ф-ции то мог сообразить что там нуль в конце обязан быть
← →
Chlavik © (2004-12-06 03:23) [12]Ты видиш что тут написано
P:=Pointer(S)
а не
P:=PChar(S) - замечаш разницу ?
А если бы у типа string не было бы в конце нулевого символа LStrToPChar выделяла новую память (хоть это и тупо но возможно)??? Так что не надо так сразу отвечать (не подумав самому)
← →
default © (2004-12-06 03:25) [13]Chlavik © (06.12.04 03:23) [12]
спокойно!
надо излагать чётче
никто ниче не понимает
а насчёт возможно - разве что теоретически
← →
Morfein (2004-12-06 04:32) [14]Pascal String не равно Null Terminated, а ноль в конце если и есть, то это не заслуга того, кто в строку данные заносил, просто нули в памяти там уже были.
← →
Fay © (2004-12-06 08:22) [15]2 Chlavik © (06.12.04 01:14)
Если мне склероз не изменяет, то все строки в Delphi - Null Terminated. Только приведение P:=Pointer(S) некорректно, т.к. на самом деле нужен адрес первого символа P:=Pointer(@S[1]) Если он там есть 8). Проще сделать PChar(S).
← →
Leonid Troyanovsky (2004-12-06 09:34) [16]
> Fay © (06.12.04 08:22) [15]
> Если мне склероз не изменяет, то все строки в Delphi - Null
> Terminated. Только приведение P:=Pointer(S) некорректно,
> т.к. на самом деле нужен адрес первого символа P:=Pointer(@S[1])
> Если он там есть 8). Проще сделать PChar(S).
It is also possible to typecast a long string to an untyped pointer, using the syntax Pointer(S), where S is a long string expression. A Pointer typecast returns the address of the first character of the long string value. Unlike a PChar typecast, a Pointer typecast returns nil if the string expression is empty.
Короче, RTFM: Long string types
--
С уважением, LVT.
← →
Fay © (2004-12-06 09:40) [17]2 Leonid Troyanovsky (06.12.04 09:34) [16]
То, что я написал, я прочитал на это форуме довольно давно, и с тех пор так и не слазил в хелп. Видимо зря 8)
← →
Piter © (2004-12-06 17:36) [18]Piter © (06.12.04 1:48) [1]
А что некоректного??
да нормально все. Просто я ошибся.
Я почему то думал, что Pointer(s) будет указывать на начало AnsiString, то есть на управляющую структуру, а не на сам текст строки. В принципе, я и сейчас считаю, что так логичнее. Мне всегда казалось, что Pointer(var) указывает на начало структуры var в памяти. А оказывается не так...
Fay © (06.12.04 8:22) [15]
Только приведение P:=Pointer(S) некорректно, т.к. на самом деле нужен адрес первого символа
я тоже так думал. Оказывается, Delphi очень хитро приводит строки...
Leonid Troyanovsky (06.12.04 9:34) [16]
It is also possible to typecast a long string to an untyped pointer, using the syntax Pointer(S), where S is a long string expression. A Pointer typecast returns the address of the first character of the long string value. Unlike a PChar typecast, a Pointer typecast returns nil if the string expression is empty.
о, точно...
Век живи - век учись...
← →
Chlavik © (2004-12-06 19:01) [19]
> Только приведение P:=Pointer(S) некорректно, т.к. на самом
> деле нужен адрес первого символа P:=Pointer(@S[1])
P:=Pointer(@S[1]) это тоже самое что и P:=@S[1]; Pointer это приведение к типу, а вот @ получает адрес переменной.
Многие сдесь путаю P:=Pointer(@S) (то же что и P:=@S) и
P:=Pointer(S). В первом случае в P будеn адрес самой переменной S а во втором содержание перменной S а это указатель на первый символ строки если строка не нулевая ... Так что я пришол к выводу если не пустые Pascal сроки заканчиватся на нулевой символ то P:=Pointer(S) и P:=PChar(S) - одно и тоже кроме варианта с пустой строкой (тогда при P:=Pointer(S) в З будет Nil а при P:=PChar(S) в P будет укзтель на нулевой символ (наверное) ... :)
← →
jack128 © (2004-12-06 19:33) [20]Piter © (06.12.04 17:36) [18]
В принципе, я и сейчас считаю, что так логичнее
Этот как сказать..Внутреняя реализация string - это личное дело борланда, вобщем то. Да и ясно из каких критериев они исходили делая именно так, а не иначе.
А вот то, чтот ЯВНОЕ привидение типов приводит к вызову функции(!!!) вот это, имхо, не логично.
← →
Piter © (2004-12-06 20:14) [21]jack128 © (06.12.04 19:33) [20]
А вот то, чтот ЯВНОЕ привидение типов приводит к вызову функции(!!!) вот это, имхо, не логично.
кстати, да...
← →
Fay © (2004-12-06 20:21) [22]>> А вот то, чтот ЯВНОЕ привидение типов приводит к вызову
>> функции(!!!) вот это, имхо, не логичн
Если бы было иначе, то первая страница форума выглядела бы очень весело. Не лениво бы стало рассказывать всем про "управляемое время жизни"? 8)
← →
ламер © (2004-12-07 18:16) [23]jack128 © (04.12.06 19:33) [20]
а по-моему, наоборот, логично. начать хотя бы с того, что любое приведение типов - это уже само по себе функция, получающая параметр и возращающая результат.
в с++, например, это выглядит так:
class MyClass
{
public:
operator int()
{
}
}
← →
ламер © (2004-12-07 18:18) [24]что позволяет самому задавать правила перевода экземпляра класса TMyClass к типу int:
MyClass c;
int i;
i = c;
← →
jack128 © (2004-12-07 19:19) [25]ламер © (07.12.04 18:16) [23]
начать хотя бы с того, что любое приведение типов - это уже само по себе функция, получающая параметр и возращающая результат.
в С это так. Но не в дельфи. В дельфи в большенстве случаев (точнее во всех случаях, исключая приведения строковых типов) привидение - это лишь указание компилятору считать, переменная имеет тип к которому ты её приводишь.
← →
jack128 © (2004-12-07 19:25) [26]jack128 © (07.12.04 19:19) [25]
Но не в дельфи
Это верно для 1-7 версий.
В восмёрке ввели перегрузку операторов(в том числе и приведения). Куда катиться мир??
← →
Fay © (2004-12-07 22:30) [27]2 jack128 © (07.12.04 19:19) [25]
>> привидение - это лишь указание
8)
← →
Игорь Шевченко © (2004-12-08 00:51) [28]
> В дельфи в большенстве случаев (точнее во всех случаях,
> исключая приведения строковых типов) привидение - это лишь
> указание компилятору считать, переменная имеет тип к которому
> ты её приводишь
Таки во всех, кроме строковых ?
function MyVarToInt (Value: Variant): Integer;
begin
Result := Integer(Value);
end;
С уважением,
← →
Chlavik © (2004-12-08 18:27) [29]Ну извините... Если уже понадобится вызов какойто функции для приведения что то типа pointer к DWORD и тому подобное так это уже серьёзно ... По сути приведение типов это отображения значения области памяти в таком виде как надо програмисту ( что типа absolute или union на Си) Так что мне кажется никаких фукнций не должно быть, а если они есть то это уже не оптимзация, вить приведения типов в осноном используется для оптимизации...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.045 c