Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.29;
Скачать: CL | DM;

Вниз

Тип PChar   Найти похожие ветки 

 
Новичек ©   (2003-05-16 21:02) [0]

Уважаемые знатоки, растолкуйте, пожалуйста:
Есть переменная, допустим, Anything: PChar.
Это, как следует из помощи, ссылка на строку с завершающим нулем.
Тогда выражение вида
Anything^:="Что-то вроде строки" совершенно корректно (по крайней мере компиллер не ругается).
Не ругается он и на выражение вида
Anything[0]:="Тоже что-то типа строки".
Почему?!!! Никак понять не могу, хоть всё и работает :-(


 
Skier ©   (2003-05-16 21:08) [1]

Anything^ и Anything[0] это начала символьного массива индексируемого с нуля, в Delphi такой массив и строка совместимы,
а вот то что это работает без выделения памяти, так это просто
пока везёт.


 
Новичек ©   (2003-05-16 21:13) [2]


> Skier

Я опустил выделение памяти. Разумеется, это не будет работать без оного. Огромное спасибо, Skier, а то я, грешным делом, подумал, что в Дельфях глюки :-)


 
Malder ©   (2003-05-16 21:14) [3]

Какой вопрос странный, специально аж дельфи загрузил, чтобы удостовериться :-)))

Anything^:="Что-то вроде строки" совершенно корректно (по крайней мере компиллер не ругается).

[Error] Unit1.pas(29): Incompatible types: "Char" and "String"


 
Новичек ©   (2003-05-16 21:16) [4]

Поверьте на слово - компиллируется и работает в готовой программе.


 
Skier ©   (2003-05-16 21:18) [5]

>Malder © (16.05.03 21:14)
Видимо здесь нужно обратить внимания (раз уж "компиллер не ругается") на следующие слова автора вопроса
" Что-то вроде строки" и
"Тоже что-то типа строки". :))


 
Новичек ©   (2003-05-16 21:20) [6]


> Malder

Кстати, при чём тут Char? Я говорил про PChar.


 
Malder ©   (2003-05-16 21:21) [7]

Блин, с какого рожна я должен верить ?

PChar - это указатель на Char (1 байт, один символ) ! Соответственно

Anything^:="Что-то вроде строки";

работать не будет. Будет работать:

Anything^:="T";

P.S. И мой дельфи это подтверждает, естесственно. Не вешай лапшу на уши


 
Malder ©   (2003-05-16 21:23) [8]

Если Anything - это PChar, то Anything^ - это Char

P.S. Берем книги по программированиею и ищем главы про указатели


 
Новичек ©   (2003-05-16 21:24) [9]


> Malder

Неправильно! PChar - это указатель на строку!!!


 
Skier ©   (2003-05-16 21:26) [10]

>Malder © (16.05.03 21:23)
A PChar is a pointer to a null-terminated string of characters of the type Char.


 
Malder ©   (2003-05-16 21:30) [11]

Верно, но технически это указатель на первый символ в этой строке


 
Malder ©   (2003-05-16 21:32) [12]

Поэтому Anything^:="Что-то вроде строки";

работать НЕ БУДЕТ


 
Новичек ©   (2003-05-16 21:35) [13]

Проясняю ситуацию. Вот фрагмент кода:
procedure TForm1.TTFileSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
ReadBuff : PChar;
BuffLen : Integer;
begin
BuffLen := Socket.ReceiveLength;
GetMem(ReadBuff, BuffLen+1);
Socket.ReceiveBuf(ReadBuff[0], BuffLen);
if JCLStrings.StrFind(TTFileStr, ReadBuff)<>0 then TTFileWait:=True;
FreeMem(ReadBuff);
end;
Это работает.
Form1.TTFileSocket.Socket.SendBuf(INFUE02^,INFUE02Len);
Это тоже работает.
А этот фрагмент
var
Anything: PChar;
begin
Anything^:="....";
или
Anything[0]:="...";
не работает!!!
П О Ч Е М У ?!!!


 
default ©   (2003-05-16 22:02) [14]

Новичек © (16.05.03 21:35)
потому что ты не понимаешь как устроен PChar, а устроен он
очень просто, хотя бы по сравнению со String
Malder тут только прав
читайте его посты
откройте окно CPU и всё встанет на свои места

PChar - это указатель на первый символ строки
конец строки определяется символом #0


 
Morfein ©   (2003-05-16 22:02) [15]

Ты память не выделил под Anything... А вообще, просто запомни, что PCHAR - это ЧИСЛО ТИПА DWORD... забудь про то, что это как-то ассоциируется со строками... это просто ЧИСЛО.


 
default ©   (2003-05-16 22:09) [16]

Skier © (16.05.03 21:08)
var
Str: PChar;
begin
Str := "Any String"

при присвоение память Delphi под строку выделяет за нас

Morfein © (16.05.03 22:02)
причём здесь память?
читай посты Malder-а они все верны


 
Новичек ©   (2003-05-16 22:10) [17]

Память я выделял, просто не написал здесь, считая это само собой разумеющимся. Почему же в сокетах ЭТО работает, а в остальных фрагментах - нет. Я поступил так же, как Malder, загрузил Дельфи, попробовал вышеупомянутые неработающие примеры и убедился, что он прав. Но они в сокетах работают! Блин, голова уже раскалывается...


 
default ©   (2003-05-16 22:11) [18]

в сокетах совсем другое
там ты передаёшь параметр по ссылке...
читай в хелпе что это такое
и смотри окно CPU
я с помощью него много ответов нашёл...


 
Новичек ©   (2003-05-16 22:15) [19]


> default

Хм... Похоже на правду... Тогда понятно, почему в сокетам наплевать, как писать: Anything^ или Anything[0].


 
default ©   (2003-05-16 22:15) [20]

Morfein © (16.05.03 22:02)
ну знаешь четыре байта можно трактовать не только как DWORD
лучше сказать что эти четыре байта указывают на первый символ строки тогда уж


 
default ©   (2003-05-16 22:16) [21]

Новичек © (16.05.03 22:15)
конечно
память ты же выделил
в подпрограмму адрес передал
и поэтому всё тип-топ


 
Fantasist.   (2003-05-17 01:02) [22]


> лучше сказать что эти четыре байта указывают на первый символ
> строки тогда уж


Лучше сказать, что это просто указатель на сhar.
Такие определения как:

PChar - это указатель на первый символ строки

не являются корректными так как PChar может указывать куда угодно, хоть на сам символ #0, хоть на первый байт какого-нибудь integer.
Единственно, что собственно связывает этот тип со строкой, так это поддержка компилятора.



> Память я выделял, просто не написал здесь, считая это само
> собой разумеющимся


Вот кусок кода:

var
p:PChar;
bein
p:="short string";
end;


Здесь память под p выделять нельзя ни в коем случае, так же как и освобождать ее.


 
default ©   (2003-05-17 01:25) [23]

Fantasist. (17.05.03 01:02)
"Лучше сказать, что это просто указатель на сhar."
я то это знаю!
"не являются корректными так как PChar может указывать куда угодно, хоть на сам символ #0, хоть на первый байт какого-нибудь integer.
Единственно, что собственно связывает этот тип со строкой, так это поддержка компилятора."
это всё и ежу понятно
так можно сказать про любую область памяти
просто память, но "что-то" её поддерживает...



 
Anatoly Podgoretsky ©   (2003-05-17 08:15) [24]

Fantasist. (17.05.03 01:02)
Не единственно и не главное, а главное это соглашение, что используя этот тип мы подразумеваем, что это будет указатель на нультерминированную строку. Исключения должны как минимум документироваться и не использоваться по этому назначению, например нельзя его передавать в функции, которые ожидают этого, а так просто указатель.


 
Skier ©   (2003-05-17 09:42) [25]

>default © (16.05.03 22:09)

> при присвоение память Delphi под строку выделяет за нас

Прогони через Ctrl+Alt+C. Будет ли выделение памяти ?


 
Malder ©   (2003-05-17 10:35) [26]

Нет, будет просто ссылка на первый символ строки, записанной в сегменте данных...



Страницы: 1 вся ветка

Текущий архив: 2003.05.29;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.012 c
1-94916
xfrost
2003-05-15 18:45
2003.05.29
TChart плавные графики


1-94938
Лесник
2003-05-17 22:55
2003.05.29
Самый старый файл в папке


1-94894
Ajax
2003-05-15 23:07
2003.05.29
Самое нижнее окно.


1-94839
Алекс
2003-05-16 01:28
2003.05.29
Работа с датой


14-95097
Dimaz-z
2003-05-11 16:45
2003.05.29
Как уменьшить размер exe шника без штук, типа UPX, KOL,...