Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-6051
Berezne
2004-02-17 17:51
2004.03.03
Правильное отображение дати


6-6171
NewD
2003-12-26 13:46
2004.03.03
Как переадресовать запрос на др. комп. в др. сети


1-6085
dr Tr0jan
2004-02-19 05:58
2004.03.03
Отражение процесса копирования файла.


1-6138
Harm
2004-02-19 16:34
2004.03.03
Последний день месяца


1-6122
Alex_DM
2004-01-23 13:42
2004.03.03
Как программно задать размеры и положение открываемого окна IE?





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