Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с буффером


Новичоккк ©   (2006-03-20 13:25:00) 

Есть буффер, создаваемый какой-то функцией. Есть переменные:
var
Buf: Pointer;
Size: Cardinal;

Как получить доступ к определенному байту буффера? Вот так работает:
Char(Pointer((Integer(buf)+i))^)
Но смотрится уж больно страшно
Попытался сделать вот так:
var
 buf
 m: array of char;
begin
 m:=buf;
 m[i]:='A';
...

Но почему-то возникают ошибки при выполнении.
Как быть?


MBo   (2006-03-20 13:40:00) [1]

var c: PChar;

c:=Buf;
c[i]...


Новичоккк   (2006-03-20 13:38:00) [2]

procedure EditBuf(Buf: Pointer; Size: Cardinal);
type
TChars = array of char;
PChars = ^TChars;
var
m:PChars;
i:integer;
begin
m:=PChars(Buf);
for i:=0 to Size-1 do
  begin
   if m[i]='X' then ...
  end;
end;

Не работает. Пишет 'Array type required'.

2KLAUS
Спасибо. Попробую воспользоваться этим. Только не очень удобно.

Неужели нельзя работать с буффером, как с массивом?
var
buf
m: array of char;
begin
m:=buf;
m[i]:='A';
...

Теоритически m - это ведь указатель на начало массива. Почему все-таки не работает?


Новичоккк   (2006-03-20 13:38:00) [3]

procedure EditBuf(Buf: Pointer; Size: Cardinal);
type
TChars = array of char;
PChars = ^TChars;
var
m:PChars;
i:integer;
begin
m:=PChars(Buf);
for i:=0 to Size-1 do
  begin
   if m[i]='X' then ...
  end;
end;

Не работает. Пишет 'Array type required'.

2KLAUS
Спасибо. Попробую воспользоваться этим. Только не очень удобно.

Неужели нельзя работать с буффером, как с массивом?
var
buf
m: array of char;
begin
m:=buf;
m[i]:='A';
...

Теоритически m - это ведь указатель на начало массива. Почему все-таки не работает?


TUser   (2006-03-20 13:34:00) [4]

> KLAUS ©   (20.03.06 13:31) [2]

Да, если уж на Delphi - то байтик по нужному смещению без TStream никак не заменить, причем почему-то из всех его наследников надо испольовать именно TFileStream. Куда мир катится?


KLAUS   (2006-03-20 13:31:00) [5]

Ну если ты знаешь, адрес этото байта и хочешь его заменить:
PEFile:=tfilestream.Create(Edit1.Text,fmOpenReadWrite);
size:=pefile.Size;
getmem(buf,size);
pefile.Read(buf^,size);
b:=$D2;
pefile.Seek(i,sofrombeginning);
pefile.Write(b,1);

В данном случае i адрес байта


TUser   (2006-03-20 13:28:00) [6]

> Char(Pointer((Integer(buf)+i))^)
> Но смотрится уж больно страшно

Не бойся - это Паскаль. Можешь еще написать так
type
TChars = array of char;
PChars = ^TChars;

var C: PChars;

...

C:=PChars (Buf)
C[i] - это будет твой char


Наверх

Титульная страница Поиск, карта сайта Написать письмо