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

Вниз

Mem.ReadBuffer(buffer^,$ff) читает до первого #$00. Как обойти?   Найти похожие ветки 

 
Cosinus ©   (2004-02-19 18:35) [0]

Или может есть что то альтернативное?


 
MBo ©   (2004-02-19 18:40) [1]

Что такое Mem, что такое buffer, и как выяснилось, что "читает до первого #$00"?
Код?


 
Cosinus ©   (2004-02-19 18:47) [2]


var
t:byte;
Buffer: PChar;
RS : TResourceStream;
Mem:TMemoryStream;
begin
....
RS := TResourceStream.Create(HInstance, "DAT", "RT_RCDATA");
Mem:= TMemoryStream.Create;
Mem.LoadFromStream(RS);
GetMem(Buffer, $ff);

For Counter:=0 to 93 do
try
Mem.ReadBuffer(buffer^,$ff);
finally
end;

FreeMem(Buffer);
Mem.Free;
RS.Free;
.....
end


 
Cosinus ©   (2004-02-19 18:50) [3]

Я знаю, что лежит в DAT. После Mem.ReadBuffer(buffer^,$ff); я воткнул Showmessage, который показывает Length(buffer), поэтому я знаю что он доходит только до первого символа, с кодом 0


 
MBo ©   (2004-02-19 18:52) [4]

For Counter:=0 to 93 do
try
Mem.ReadBuffer(buffer^,$ff);
finally
end;

хм...
много раз читается в один кусок памяти

так где видно, что читается не 255 байт, а до нулевого символа?
может, все же читается, но не отображается при попытке куда-то вывести?


 
MBo ©   (2004-02-19 18:53) [5]

>я воткнул
Код ;)


 
Владислав ©   (2004-02-19 18:54) [6]

Ха! ShowMessage! Это круто!

Есть такое понятие, как строки, завершающиеся нулем.


 
Cosinus ©   (2004-02-19 19:00) [7]

Даю полный код


var
Counter:byte;
Buffer: PChar;
RS : TResourceStream;
Mem:TMemoryStream;
DatStr:String

begin
....
Richedit1.Lines.Add("Loading ...");
RS := TResourceStream.Create(HInstance, "DAT", "RT_RCDATA");
Mem:= TMemoryStream.Create;
Mem.LoadFromStream(RS);
Richedit1.Lines.Add(InttoStr(Mem.Size));
GetMem(Buffer, $ff);
for Counter:=0 to 93 do
try
Mem.ReadBuffer(buffer^,$ff);
Gauge.AddProgress(1);
DatStr:=#$01+#$00+chr(Counter)+#$00+#$01+#$00+buffer;
PortInit(WrCommCrc(DatStr,true),PortBd); //Это моя процедура, которая пишет данные в COMport
If not ReadAnswer(4,400) then //Ждем ответ от девайса
begin
Log(clRed,"Error with errorcode [1] - timeout");
ShowMessage("String length="+IntToStr(Length(DatStr)));
exit;
end;
finally
end;
Gauge.Progress:=0;
FreeMem(Buffer);
Mem.Free;
RS.Free;
Richedit1.Lines.Add("Ok");

.....
end;



 
Anatoly Podgoretsky ©   (2004-02-19 19:05) [8]

Length(buffer), для подобных буферов не надо использовать.


 
Cosinus ©   (2004-02-19 19:09) [9]

Без разницы, этот ShowMessage я от дурости написал, я же все равно вижу, что идет в порт. Доходит до первого символа с 0.


 
Владислав ©   (2004-02-19 19:10) [10]

> Anatoly Podgoretsky © (19.02.04 19:05) [8]

Сие утверждение из чего следует? Просветите пожалуйста.


 
Cosinus ©   (2004-02-19 19:26) [11]

Так в чем у меня проблемма то? В хелпе на эту тему я ничего не нашел.


 
Serginio666   (2004-02-19 19:28) [12]

Отображение стринга, pchar заканчивается при обноружении #0
так как строки нультерминированы.


 
Anatoly Podgoretsky ©   (2004-02-19 19:32) [13]

Владислав © (19.02.04 19:10) [10]
Документировано в справке, копирование данных в строку произойдет до первого символа нуля, поэтому применять это бессмысленно.


 
Serginio666   (2004-02-19 19:33) [14]

Не совсем так. Копирование через Move пройдет как надо, а вот конкатенция строк до первого #0.


 
Cosinus ©   (2004-02-19 19:34) [15]

Anatoly Podgoretsky © (19.02.04 19:32) [13]
А как поступить при таком раскладе?


 
Anatoly Podgoretsky ©   (2004-02-19 19:36) [16]

Применять методы копирования для PChar строк


 
Владислав ©   (2004-02-19 19:41) [17]

> Anatoly Podgoretsky © (19.02.04 19:32) [13]

Я ступил, когда вопрос задавал. (перепутал Ваш код и не ваш, сорри :) Сначала посмотрел на это "Length(DatStr)", а потом уже спросил). Так что Вы, естесственно, правы на все сто.


 
Serginio666   (2004-02-19 19:42) [18]

Если не хочешь замарачиваться с копированием используй наследников TStream он как раз для таких задач в самый раз.


 
Verg ©   (2004-02-19 19:49) [19]


> Mem.ReadBuffer(buffer^,$ff);


Тут совершенно не при чем.
Все дело в этом:


> DatStr:=#$01+#$00+chr(Counter)+#$00+#$01+#$00+ buffer;


Где DatStr - это string, а buffer - pchar;

Здесь вы заставляете преоразовывать pchar к string. Что такое pchar и что такое для pchar #0 - думаю объяснять не надо.



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

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

Наверх




Память: 0.51 MB
Время: 0.017 c
1-6110
DelphiN!
2004-02-20 18:54
2004.03.03
Автозагрузка в WinXP


3-5973
phantom2040
2004-02-05 13:34
2004.03.03
По набивке таблицы


14-6213
syte_ser78
2004-02-11 12:09
2004.03.03
разбивка имени компонента


9-5936
Micah'GF
2003-08-17 10:02
2004.03.03
DXDraw.Canvas.LineTo


14-6190
Andreas
2004-02-11 18:29
2004.03.03
Пропали подключения ?