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

Вниз

почему изменяется буфер у процедуры blockwrite   Найти похожие ветки 

 
depresnjak   (2004-07-13 08:19) [0]

я использую процедуру blockwrite, после записи переменная буфера, типа pchar увеличивается на 3 байта, с чем это может быть связано?


 
KSergey ©   (2004-07-13 08:25) [1]

Код - секретный?


 
Digitman ©   (2004-07-13 08:35) [2]


> переменная буфера, типа pchar увеличивается на 3 байта


это как ?

sizeof(PChar) в win32 всю жизнь был и останется равным 4, с какого перепугу sizeof(PChar) вдруг станет  4 + 3 = 7 ?


 
Sha ©   (2004-07-13 10:36) [3]

> depresnjak   (13.07.04 08:19)

Не верю.
После BlockWrite может измениться только значение переменной,
в которой возвращается количество реально переданных блоков.


 
depresnjak   (2004-07-13 14:00) [4]

Я заполняю переменную p буквами.
Затем смотрю Length(p) 10240.
Делаю blockwrite.
После опять смотрю Length(p).
И оказывается уже 10243.
В чём прикол.
(и не говорите, что мол "подрастёш поймёш")


 
Тимохов ©   (2004-07-13 14:02) [5]


> В чём прикол.

в отсутствии твоего кода.


 
depresnjak   (2004-07-13 14:02) [6]

Я извиняюсь что первый раз не правильно написал


 
ASMiD   (2004-07-13 14:06) [7]

Код в студию!


 
depresnjak   (2004-07-13 14:07) [8]

getmem(s,n);
ZeroMemory(s,n);
for j:=0 to n-1 do
  s[j]:=chr(random(30)+190);
seek(f,0);
x:=length(s);
showmessage(inttostr(x));{10240}
BlockWrite(f,s^,x,writedata);
x:=length(s);
showmessage(inttostr(x));{10243}


 
Тимохов ©   (2004-07-13 14:13) [9]

что такое s?


 
depresnjak   (2004-07-13 14:14) [10]

var s:pchar;


 
depresnjak   (2004-07-13 14:15) [11]

да кстати она локально объявлена


 
Sandman25 ©   (2004-07-13 14:17) [12]

PChar должен заканчивать символом с кодом 0.
S[N-1] := #0


 
Тимохов ©   (2004-07-13 14:17) [13]

все потому, что в конце s у вас #0 нет.


 
depresnjak   (2004-07-13 14:19) [14]

то есть при инициализации надо так:
getmem(s,n+1);
ZeroMemory(s,n+1);
for j:=0 to n-1 do
 s[j]:=chr(random(30)+190);


 
ASMiD   (2004-07-13 14:21) [15]

В PChar строка ограничена #0
А как будет работать
> length(s);
я не очень понимаю


 
Тимохов ©   (2004-07-13 14:23) [16]


> ASMiD   (13.07.04 14:21) [15]

да все понятно - в первый раз 0 найден в одном месте (совсем не в строке), во второй раз - в другом.
отседова и раз-ты разные.


 
ASMiD   (2004-07-13 14:25) [17]

Так я это и имел ввиду


 
depresnjak   (2004-07-13 14:27) [18]

length работает замечательно
сравнил результаты
всё ok

>Тимохов
как это - сначало в одном, потом в другом?
Тогда почему первый раз length хорошо работает?


 
Тимохов ©   (2004-07-13 14:29) [19]


> length работает замечательно

не может замечательно работать.

при преобразовании pchar в string в качетве длинны берется длина до символа 0, а он у вас каждый раз в разном месте, т.к. расположен где-то далеко вне строки :)).


 
Reindeer Moss Eater ©   (2004-07-13 14:31) [20]

Так ведь и родная для PChar StrLen покажет длину до первого нуля.


 
depresnjak   (2004-07-13 14:32) [21]

Тогда какие типы лучше использовать для буфера?


 
depresnjak   (2004-07-13 14:32) [22]

Удалено модератором


 
depresnjak   (2004-07-13 14:33) [23]

ММдаа, дублёж


 
ASMiD   (2004-07-13 14:35) [24]


> showmessage(inttostr(x));{10240}
> BlockWrite(f,s^,x,writedata);

В этот момент и происходит изменение информации, и 0 появляется в другом месте и из примера не видно чему равно n 10240 или где?


 
depresnjak   (2004-07-13 14:35) [25]

И ещё, интересно почему когда я выделял разное количество байт под буфер, после blockwrite он увеличивался на 3 байта??


 
Reindeer Moss Eater ©   (2004-07-13 14:35) [26]

А зачем вообще мерять длину чего-то если под это чего-то выделена память и зармер её мы знаем заранее?


 
ASMiD   (2004-07-13 14:36) [27]

Любые. Главное с размерностью работать корректно.


 
Digitman ©   (2004-07-13 14:36) [28]


> depresnjak   (13.07.04 08:19)  



> переменная буфера, типа pchar увеличивается на 3 байта


чушь.
переменная типа PChar не увеличивается ни на 3 байта, ни на 30  .. как была она 4 байта, так и осталась

а вот Length(s) подсчитает число символов в буфере , адрес которого хранится в 4-байтной переменной s, исключая первый встреченный при сканировании буфера символ-терминатор

кстати, что за блажь - использовать length() для PChar ? чем string-то не угодил ?
да еще Zeromemory зачем-то приплел ..

следующий код позволяет не заботиться ни о каких символах-терминаторах

var
 s: String;
..
 setlength(s, n);
 for j:=1 to n do
  s[j]:=chr(random(30)+190);


 
depresnjak   (2004-07-13 14:39) [29]

>Reindeer Moss Eater
вы правы, но уменя вопрос в другом, почему он изменяется на одинаковое количество байт?
И ещё, я несколько раз вызываю length и перед blockwrite он даёт правильный результат


 
Reindeer Moss Eater ©   (2004-07-13 14:40) [30]

почему он изменяется на одинаковое количество байт?

Потмоу, что так нули ложаться.


 
Тимохов ©   (2004-07-13 14:40) [31]


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

это вас не должно волновать, т.к. из ложного утверждения можно получить любое утверждение, в том числе и ложное. Т.е. зачем копать навоз ошибки?


 
Тимохов ©   (2004-07-13 14:42) [32]


> Потмоу, что так нули ложаться.

скорее карты :)))
Это магия лажи


 
Digitman ©   (2004-07-13 14:42) [33]


> depresnjak   (13.07.04 14:39) [29]


не занимайся ерундой с PChar, не надо оно тебе для этого случая

var
s: String;
..
setlength(s, n);
for j:=1 to n do
 s[j]:=chr(random(30)+190);

BlockWrite(f, PChar(s)^, n, BytesWritten);


 
ASMiD   (2004-07-13 14:45) [34]

Если копать куда уходят мозги машины при неправильной работе с памятью - может жизни не хватить


 
depresnjak   (2004-07-13 14:47) [35]

>Digitman
Спасибо за string, приведённый при записи к Pchar


 
Digitman ©   (2004-07-13 14:55) [36]


> depresnjak   (13.07.04 14:47) [35]


угу .. будто бы сам догадаться не мог, что миинимизация геморроя при работе со строкой - это использование типа String, а при первой же трэбе привести адрес буфера, на который ссылается переменная типа String - сущий пустяк .. как два байта обоxxxxx


 
Sha ©   (2004-07-13 16:06) [37]

...переслать



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

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

Наверх




Память: 0.55 MB
Время: 0.027 c
1-1089705911
half_litre
2004-07-13 12:05
2004.07.25
Hint в формах из dll


1-1089509617
Алекс А
2004-07-11 05:33
2004.07.25
Можно ли программно, точно определить корень слова ?


14-1088951968
Vasya.ru
2004-07-04 18:39
2004.07.25
Компы не коннектятся!


3-1088398321
Марат
2004-06-28 08:52
2004.07.25
DBGridEh


14-1089112895
Zlod3y
2004-07-06 15:21
2004.07.25
Версии Delphi