
Класс 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. Заранее Спасибо.