Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-95075
Step[B.M.]
2003-05-10 15:41
2003.05.29
Где в Inete можно найти примеры создания процедур, триггеров IB


1-94855
Serguar
2003-05-20 10:01
2003.05.29
присвоение переменным значения Null


3-94726
Olga
2003-04-29 13:13
2003.05.29
Как заставить базу понимать запятую в качестве разделителя?


14-95013
Dmitriy O.
2003-05-08 14:41
2003.05.29
ИМХО :) =)) и прочее


1-94867
Aleksandr
2003-05-20 11:20
2003.05.29
Что за глюк с вычислениями времени?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский