Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1102592157
DiamondShark
2004-12-09 14:35
2004.12.26
Трассировка порождённых процессов.


14-1102611828
syte_ser78
2004-12-09 20:03
2004.12.26
jpg в бд


6-1097472068
Slonco
2004-10-11 09:21
2004.12.26
В отправленном письме абракадабра...


1-1102678554
Zilog
2004-12-10 14:35
2004.12.26
Как завершить работу потока принудительно, в ходе его работы?


14-1101995436
TButton
2004-12-02 16:50
2004.12.26
Internal Server Error задолбаллллллллллллл!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский