Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Pascal String


Страницы:   1 2

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]


А кто сказал что там в памяти что до меня было записано - там много нулей - если ты заметил...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо