Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Вниз

Вопрос о типе PChar.   Найти похожие ветки 

 
Beginner   (2003-12-21 12:40) [0]

Имеется нижеследующая процедура:

procedure TClientSocket.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
Count: Integer;
LocalBuffer: PChar;
begin
Count := Socket.ReceiveLength;
GetMem(LocalBuffer, Count + 1);
Socket.ReceiveBuf(LocalBuffer^, Count);
_Buffer := LocalBuffer;
FreeMem(LocalBuffer);
end;

Не могу понять - почему
_Buffer := LocalBuffer;
а не
_Buffer := LocalBuffer^; ?!!!
Поясните, пожалуйста, неграмотному :-(


 
jack128   (2003-12-21 12:56) [1]

Для начала, какой тип имеет _Buffer ? string?
И чего бы добился такой записью
> _Buffer := LocalBuffer^;
localBuffer^ - это символ, а не строка.


 
Digitman   (2003-12-21 13:13) [2]


> Не могу понять - почему
> _Buffer := LocalBuffer;
> а не
> _Buffer := LocalBuffer^; ?!!!


ни так ни так не будет правильно
тем паче - с учетом следующей же строчки FreeMem(LocalBuffer);

я бы посоветовал сделать так :

procedure TClientSocket.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
Count: Integer;
LocalBuffer: PChar;
begin
Count := Socket.ReceiveLength;
if Count = 0 then Exit;
GetMem(LocalBuffer, Count);
try
Count := Socket.ReceiveBuf(LocalBuffer^, Count);
MemStream.WriteBuffer(LocalBuffer^, Count);
finally
FreeMem(LocalBuffer);
end;
end;


 
jack128   (2003-12-21 13:59) [3]


> Digitman © (21.12.03 13:13) [2]

Разве? Вроде при таком присвоении String := Pchar не происходит копирование строки?
По крайней мере такой код работает нормально
var
Buf: PChar;
Str: string;
begin
GetMem(Buf, 10);
try
FillChar(Buf^, 9, "1");
Str := Buf;
finally
FreeMem(Buf);
end;
Str := Str + "1"; // Для перераспределения памяти
Caption := Str;
end;


 
jack128   (2003-12-21 14:05) [4]


> Вроде при таком присвоении String := Pchar не происходит
> копирование строки?
Читать как:
Вроде при таком присвоении String := Pchar происходит
копирование строки!


 
Beginner   (2003-12-21 14:13) [5]


> Digitman
Что по этому поводу скажет признанный авторитет?


 
Anatoly Podgoretsky   (2003-12-21 14:17) [6]

А ничего, пока ты не скажешь, что такое _Buffer


 
Digitman   (2003-12-21 14:25) [7]


> Beginner


во-первых, см. Anatoly Podgoretsky © (21.12.03 14:17) [6]

во-вторых, на кой черт вообще нужен некий лок.буфер, если у тебя нет ни намека на накопительный буфер ?


 
Beginner   (2003-12-21 14:25) [8]

Прошу прощения:
_Buffer: String;


 
jack128   (2003-12-21 14:25) [9]

Вообще мой код роботает по случайности :-)
нужно Buf := AllocMem(10);

> Beginner
Если ты знаешь asm, то можешь сам ответить на мой вопрос просмотрев исходники System._LStrFromPChar и далее.


 
jack128   (2003-12-21 14:28) [10]


> Digitman ©
Ну не уходите ответа ;-) Мы обсуждаем технич сторону дела, а н логику программы Beginner"а. Так как насчет

> jack128 © (21.12.03 13:59) [3]


 
Digitman   (2003-12-21 14:28) [11]


> Прошу прощения:
> _Buffer: String;


ну и каков смысл ? в двух буферах одного и того же назначения ?

в примере, который я привел, MemStream - накопительный буфер.

Это - очередь принимаемых данных. В голову ее идет запись в обработчике события приема из гнезда, а из хвоста ее данные могут быть считаны в любой момент времени любой процедурой, которая, собственно, и анализирует принимаемый поток данных


 
Digitman   (2003-12-21 14:31) [12]


> jack128 © (21.12.03 14:28) [10]
>
> Ну не уходите ответа


на тот момент не было известно [8]

но если ты настаиваешь, то по факту [8] насчет копирования, происходящем при AnsiStringVar = AnsiString(PCharData), ничего не имею против


 
Beginner   (2003-12-21 14:32) [13]

Всё это очень хорошо, на как же всё-таки насчёт:
> Не могу понять - почему
> _Buffer := LocalBuffer;
> а не
> _Buffer := LocalBuffer^; ?!!!


 
Beginner   (2003-12-21 14:34) [14]

Уважаемые Мастера, меня не интересует конкретное применение.
Я хочу принципиально решить этот вопрос.


 
MBo   (2003-12-21 14:36) [15]

>Beginner
подумай, какой тип данных дает LocalBuffer^


 
Digitman   (2003-12-21 14:37) [16]


> меня не интересует конкретное применение


а на кой шут ты тогда приплел сюда гнезда ?)


 
Anatoly Podgoretsky   (2003-12-21 14:44) [17]

Абсолютно лишнее и не нужное LocalBuffer, со всеми операциями, string полностью совместим PChar


 
Beginner   (2003-12-21 14:48) [18]


> MBo
Думаю, что String.


> Digitman
Над этим работаю, вот и приплёл. Разные переменные необходимы для дальнейшей обработки.


 
Digitman   (2003-12-21 14:50) [19]


> > Не могу понять - почему
> > _Buffer := LocalBuffer;
> > а не
> > _Buffer := LocalBuffer^; ?!!!


потому что в 1-м случае в _Buffer: String будут скопированы ВСЕ данные из буфера, на который указывает LocalBuffer, а во 2-м - только 1-й символ из того же буфера


 
MBo   (2003-12-21 14:50) [20]

>Думаю, что String.
На каком основании?
А PInteger^ тогда что вернет? :)


 
Beginner   (2003-12-21 14:53) [21]


> Digitman
Дошло наконец-то :-)


 
Digitman   (2003-12-21 14:55) [22]


> Над этим работаю, вот и приплёл


ну эдак можно и исходники Windows сюда привести) ... на всякий случай)) ... тоже вроде бы как причем))


> Разные переменные необходимы для дальнейшей обработки


если уж тебя приспичело именно String иметь для т.н. "дальнейшей обработки", то в данном контексте все намного проще :

procedure TClientSocket.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
Count: Integer;
begin
SetLength(__Buffer, Socket.ReceiveLength);
Count := Socket.ReceiveBuf(__Buffer[1], Length(__Buffer));
SetLength(__Buffer, Count);
end;


 
Beginner   (2003-12-21 14:55) [23]


> MBo
Ваша правда, сударь :-) Понял я свой промах.


 
Beginner   (2003-12-21 15:00) [24]


> Digitman
Спасибо, сейчас попробую.


 
Digitman   (2003-12-21 15:06) [25]


> Спасибо, сейчас попробую


лучше не пробуй.
это - тупиковый путь.
протокол - поточный, рано или поздно получишь этими "граблями" по лбу и придется все переделывать.

для работы в асинхр.режиме следует сразу же предусмотреть в том или ином виде буфер накопления (очередь асинхронно поступающих данных) и извещать некий код, который уже работает с данными в очереди, о том что очередь изменила состояние (в голову очереди добавлены некие новые данные)

иными словами - не меси в одну кучу транспортные алгоритмы и алгоритмы, работающие с данными, получаемыми посредством некоего абстрактного транспорта


 
Beginner   (2003-12-21 15:11) [26]


> Digitman
Это я уже сделал :-), т.е. на грабли уже наступил, правда, давно.



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

Форум: "Основная";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.01 c
1-11978
афвуд
2003-12-19 12:21
2004.01.05
Как создать обьект класса, зная только имя класса.


14-12104
Шишкин Илья
2003-12-15 21:22
2004.01.05
Вопрос по DOS


1-11912
DNS
2003-12-21 16:22
2004.01.05
ClicksDisabled


14-12126
McSimm
2003-12-12 15:22
2004.01.05
Задачка про двухходовые шахматы.


8-12001
xxxCrazyManxxx
2003-09-03 14:24
2004.01.05
Помогите закрасить например круг.





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