Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.032 c
3-1088175347
Alibaba
2004-06-25 18:55
2004.07.25
sp_who


1-1089339922
ksa2002
2004-07-09 06:25
2004.07.25
Прорисовка таблицы (StringGrid)


1-1089483982
Комбинатор
2004-07-10 22:26
2004.07.25
Как передать в процедуру dll параметр


1-1089783129
pokxx
2004-07-14 09:32
2004.07.25
Оповещение


3-1088581515
Dina
2004-06-30 11:45
2004.07.25
Обзор на основе хранимой процедуры





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