Форум: "Основная";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];
ВнизТип 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.008 c