WriteBuffer + Указатель [Решено]

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

WriteBuffer + Указатель [Решено]

Сообщение Maxizar » 11.02.2011 19:03:47

Привет всем, простите, но я опять запутался :).

Класс TFileStream; имеет метод WriteBuffer, который получает указатель Buffer и число байт. После чего он считывает(записывает в файл) это число байт с того места в памяти на который и указывает указатель. (вроде пока все верно).
Массивы: Статический массивы т.е массивы вида:
Код: Выделить всё
T16Bits = array[0..99] of Word;

Яв-ся куском памяти, начало которой находится с адреса первого элемента т.е с T16Bits[0].
Для этого чтобы записать его в файл делаем так:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
  _16Bits :T16Bits;
    WaveFile       : TFileStream;
  i:Integer;
begin

    for I := 0 to 99 do
     _16Bits[I]:=$FFFF;


   Try
     WaveFile := TFileStream.Create('C:\Data.dat', fmCreate);
     WaveFile.WriteBuffer(_16Bits[0], 200);
   Finally
    WaveFile.Free
   End;

end;

Открываем файл, в Hex редакторе видим, все 200 байт заполнены значениями $FFFF. (радуемся)
Согласно вот этой статьи:Работа с указателями

Динамические массивы чуть больше чем кусок памяти данных, это еще указатель ссылок и длина массива. По этому чтобы записать его в файл делаем так:
Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
var
  _16Bits :TD16Bits;
    WaveFile       : TFileStream;
  LenArray:Cardinal;
  PointerToA:Pointer;
  i:Integer;
begin

    SetLength(_16Bits,100);
    for I := 0 to 99 do
     _16Bits[I]:=$FFFF;

   Try
     WaveFile := TFileStream.Create('C:\Data.dat', fmCreate);
     WaveFile.WriteBuffer(_16Bits[0], 200);   

   Finally
    WaveFile.Free
   End;
end;

Ура все получилось.

Внимание вопрос, если WriteBuffer(Buffer, 200); получает Buffer (указатель на ячейку памяти с которой нужно скопировать 200 байт). Почему не работает вот такой код:
Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
var
  _16Bits :TD16Bits;
    WaveFile       : TFileStream;
  LenArray:Cardinal;
  PointerToA:Pointer;
  i:Integer;
begin

    SetLength(_16Bits,100);
    for I := 0 to 99 do
     _16Bits[I]:=$FFFF;

   Try
     WaveFile := TFileStream.Create('C:\Data.dat', fmCreate);
     PointerToA:= @_16Bits[0];
     WaveFile.WriteBuffer(PointerToA, 200);   

   Finally
    WaveFile.Free
   End;
end;

Вроде бы PointerToA указывает на ячейку памяти с которой и начинается массив.??
Ан-но с динамическим, где я упустил нить логики.?
Зачем это нужно мне:
Есть процедура которая генерирует массив данных для АЦП\ЦАП которые пишутся в файл. Но элементы массива могут иметь различную длину 1,2,3,4… байт..(из-за чего написал тучу процедур, которые идентичны во всем кроме типа массива) Как мне сохранить лишь одну процедуру, которая бы вернула указатель на начало массива, начиная с которого я бы и записал его в файл, (длина массива заранее известна).

PS. Заранее Спасибо.
Последний раз редактировалось Maxizar 11.02.2011 22:25:33, всего редактировалось 1 раз.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: WriteBuffer + Указатель

Сообщение zub » 11.02.2011 21:16:13

Код: Выделить всё
function Write(const Buffer; Count: Longint): Longint; override;

т.е. передача адреса буфера осуществляется не указателем, а по указателю.
правильно будет
WaveFile.WriteBuffer(PointerToA^, 200);


в случае
Код: Выделить всё
WaveFile.WriteBuffer(PointerToA, 200);

в поток запишется 200 байт с адреса переменной PointerToA, а не с адреса на который указывает этот указатель, не зря компилятор будет ругается на
Код: Выделить всё
WaveFile.WriteBuffer(@_16Bits[0], 200);
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: WriteBuffer + Указатель

Сообщение Maxizar » 11.02.2011 22:25:15

zub Спасибо. Теперь все работает :wink:
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru