![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Pascal String
Chlavik © (2004-12-06 01:14:00)Скажите пожалуйста строки такого типа Null Terminated ?
т.е. кроме размера строки перед началом там есть еще 0 символ в конце ? Я могу написать что типа
var S:string;
p:PChar;
begin
P:=Pointer(S) вместо PChar потому что при последнем вызывается LStrToPChar ?
Chlavik (2004-12-08 18:27:00) [1]Ну извините... Если уже понадобится вызов какойто функции для приведения что то типа pointer к DWORD и тому подобное так это уже серьёзно ... По сути приведение типов это отображения значения области памяти в таком виде как надо програмисту ( что типа absolute или union на Си) Так что мне кажется никаких фукнций не должно быть, а если они есть то это уже не оптимзация, вить приведения типов в осноном используется для оптимизации...
Игорь Шевченко (2004-12-08 00:51:00) [2]
> В дельфи в большенстве случаев (точнее во всех случаях,
> исключая приведения строковых типов) привидение - это лишь
> указание компилятору считать, переменная имеет тип к которому
> ты её приводишь
Таки во всех, кроме строковых ?
function MyVarToInt (Value: Variant): Integer;
begin
Result := Integer(Value);
end;
С уважением,
Fay (2004-12-07 22:30:00) [3]2 jack128 © (07.12.04 19:19) [25]
>> прив и дение - это лишь указание
8)
jack128 (2004-12-07 19:25:00) [4]jack128 © (07.12.04 19:19) [25]
Но не в дельфи
Это верно для 1-7 версий.
В восмёрке ввели перегрузку операторов(в том числе и приведения). Куда катиться мир??
jack128 (2004-12-07 19:19:00) [5]ламер © (07.12.04 18:16) [23]
начать хотя бы с того, что любое приведение типов - это уже само по себе функция, получающая параметр и возращающая результат.
в С это так. Но не в дельфи. В дельфи в большенстве случаев (точнее во всех случаях, исключая приведения строковых типов) привидение - это лишь указание компилятору считать, переменная имеет тип к которому ты её приводишь.
ламер (2004-12-07 18:18:00) [6]что позволяет самому задавать правила перевода экземпляра класса TMyClass к типу int:
MyClass c;
int i;
i = c;
ламер (2004-12-07 18:16:00) [7]jack128 © (04.12.06 19:33) [20]
а по-моему, наоборот, логично. начать хотя бы с того, что любое приведение типов - это уже само по себе функция, получающая параметр и возращающая результат.
в с++, например, это выглядит так:
class MyClass
{
public:
operator int()
{
}
}
Fay (2004-12-06 20:21:00) [8]>> А вот то, чтот ЯВНОЕ привидение типов приводит к вызову
>> функции(!!!) вот это, имхо, не логичн
Если бы было иначе, то первая страница форума выглядела бы очень весело. Не лениво бы стало рассказывать всем про "управляемое время жизни"? 8)
Piter (2004-12-06 20:14:00) [9]jack128 © (06.12.04 19:33) [20]
А вот то, чтот ЯВНОЕ привидение типов приводит к вызову функции(!!!) вот это, имхо, не логично.
кстати, да...
jack128 (2004-12-06 19:33:00) [10]Piter © (06.12.04 17:36) [18]
В принципе, я и сейчас считаю, что так логичнее
Этот как сказать..Внутреняя реализация string - это личное дело борланда, вобщем то. Да и ясно из каких критериев они исходили делая именно так, а не иначе.
А вот то, чтот ЯВНОЕпривидение типов приводит к вызову функции(!!!) вот это, имхо, не логично.
Chlavik (2004-12-06 19:01:00) [11]
> Только приведение 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 будет укзтель на нулевой символ (наверное) ... :)
Piter (2004-12-06 17:36:00) [12]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.
о, точно...
Век живи - век учись...
Fay (2004-12-06 09:40:00) [13]2 Leonid Troyanovsky (06.12.04 09:34) [16]
То, что я написал, я прочитал на это форуме довольно давно, и с тех пор так и не слазил в хелп. Видимо зря 8)
Leonid Troyanovsky (2004-12-06 09:34:00) [14]
> 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 08:22:00) [15]2 Chlavik © (06.12.04 01:14)
Если мне склероз не изменяет, то все строки в Delphi - Null Terminated. Только приведение P:=Pointer(S) некорректно, т.к. на самом деле нужен адрес первого символа P:=Pointer(@S[1]) Если он там есть 8). Проще сделать PChar(S).
Morfein (2004-12-06 04:32:00) [16]Pascal String не равно Null Terminated, а ноль в конце если и есть, то это не заслуга того, кто в строку данные заносил, просто нули в памяти там уже были.
default (2004-12-06 03:25:00) [17]Chlavik © (06.12.04 03:23) [12]
спокойно!
надо излагать чётче
никто ниче не понимает
а насчёт возможно - разве что теоретически
Chlavik (2004-12-06 03:23:00) [18]Ты видиш что тут написано
P:=Pointer(S)
а не
P:=PChar(S) - замечаш разницу ?
А если бы у типа string не было бы в конце нулевого символа LStrToPChar выделяла новую память (хоть это и тупо но возможно)??? Так что не надо так сразу отвечать (не подумав самому)
default (2004-12-06 03:18:00) [19]Chlavik © (06.12.04 03:15) [10]
это конечно так
но если ты знал что такое PChar и передавал String с приведением в PChar в апи ф-ции то мог сообразить что там нуль в конце обязан быть
Chlavik (2004-12-06 03:15:00) [20]
> default © (06.12.04 03:13) [9]
А кто сказал что там в памяти что до меня было записано - там много нулей - если ты заметил...