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