Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
Внизпочему изменяется буфер у процедуры 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.033 c