![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
почему изменяется буфер у процедуры blockwrite [D7, WinXP]
depresnjak © (2004-07-13 08:19:00)я использую процедуру blockwrite, после записи переменная буфера, типа pchar увеличивается на 3 байта, с чем это может быть связано?
Sha (2004-07-13 16:06:00) [1]...переслать
Digitman (2004-07-13 14:55:00) [2]
> depresnjak (13.07.04 14:47) [35]
угу .. будто бы сам догадаться не мог, что миинимизация геморроя при работе со строкой - это использование типа String, а при первой же трэбе привести адрес буфера, на который ссылается переменная типа String - сущий пустяк .. как два байта обоxxxxx
depresnjak (2004-07-13 14:47:00) [3]>Digitman
Спасибо за string, приведённый при записи к Pchar
ASMiD (2004-07-13 14:45:00) [4]Если копать куда уходят мозги машины при неправильной работе с памятью - может жизни не хватить
Digitman (2004-07-13 14:42:00) [5]
> 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);
Тимохов (2004-07-13 14:42:00) [6]
> Потмоу, что так нули ложаться.
скорее карты :)))
Это магия лажи
Тимохов (2004-07-13 14:40:00) [7]
> вы правы, но уменя вопрос в другом, почему он изменяется
> на одинаковое количество байт?
это вас не должно волновать, т.к. из ложного утверждения можно получить любое утверждение, в том числе и ложное. Т.е. зачем копать навоз ошибки?
Reindeer Moss Eater (2004-07-13 14:40:00) [8]почему он изменяется на одинаковое количество байт?
Потмоу, что так нули ложаться.
depresnjak (2004-07-13 14:39:00) [9]>Reindeer Moss Eater
вы правы, но уменя вопрос в другом, почему он изменяется на одинаковое количество байт?
И ещё, я несколько раз вызываю length и перед blockwrite он даёт правильный результат
Digitman (2004-07-13 14:36:00) [10]
> 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);
ASMiD (2004-07-13 14:36:00) [11]Любые. Главное с размерностью работать корректно.
Reindeer Moss Eater (2004-07-13 14:35:00) [12]А зачем вообще мерять длину чего-то если под это чего-то выделена память и зармер её мы знаем заранее?
depresnjak (2004-07-13 14:35:00) [13]И ещё, интересно почему когда я выделял разное количество байт под буфер, после blockwrite он увеличивался на 3 байта??
ASMiD (2004-07-13 14:35:00) [14]
> showmessage(inttostr(x));{10240}
> BlockWrite(f,s^,x,writedata);
В этот момент и происходит изменение информации, и 0 появляется в другом месте и из примера не видно чему равно n 10240 или где?
depresnjak (2004-07-13 14:33:00) [15]ММдаа, дублёж
depresnjak (2004-07-13 14:32:00) [16]Удалено модератором
depresnjak (2004-07-13 14:32:00) [17]Тогда какие типы лучше использовать для буфера?
Reindeer Moss Eater (2004-07-13 14:31:00) [18]Так ведь и родная для PChar StrLen покажет длину до первого нуля.
Тимохов (2004-07-13 14:29:00) [19]
> length работает замечательно
не может замечательно работать.
при преобразовании pchar в string в качетве длинны берется длина до символа 0, а он у вас каждый раз в разном месте, т.к. расположен где-то далеко вне строки :)).
depresnjak (2004-07-13 14:27:00) [20]length работает замечательно
сравнил результаты
всё ok
>Тимохов
как это - сначало в одном, потом в другом?
Тогда почему первый раз length хорошо работает?