![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Начало и размер буфера динамической переменной [D7, 95/98, XP]
Who_are_you? © (2014-04-22 11:22:00)Всем здравия.
Извините, ранее не работал с динамическими переменными.
Перелапатил Инет, но остались вопросы.
В тексте ниже:
- правильно ли выделен размер массива (1900) в динамической памяти и ссылка на начало массива;
- лучше определить размер или лучше указать просто array of byte;
- что-то в программе не так - DataBuf_FT получает пачки '100,101,102,103' до конца 4к и не работает inc даже до 10;
- почему перед чтением DataBuf_FT оказывается вдруг заполнен числами от 104 до 110 ?
Вообще мне нужен динамический массив от 100 до 4к, чтоб я его мог заполнять и читать; и всегда знал его начало (адрес).
typе
D_B = array [1..1900] of byte; { массив для вывода }
Data_Bu = ^D_B;
var
Buf : Data_Bu; // массив для вывода
Data_Buf : Pbyte; // динамические данные
DataBuf_FT :array[0..4096] of byte; //
ct,i_rd : Longint;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
for ct:=0 to 4096 do DataBuf_FT[i_rd]:= 0;
New(Data_Buf);
Data_Buf:=@Buf; //начало массива - адрес буфера
for ct:=0 to 10 do // заполнение массива
begin
Data_Buf^:= ct+100; //
inc (Data_Buf);
end;
Data_Buf:=@Buf; //начало массива - адрес буфера
for i_rd:=0 to 4096 do // чтение массива
// Repeat
begin
DataBuf_FT[i_rd]:= Data_Buf^;
inc (Data_Buf);
end;
Dispose(Data_Buf);
end;
MBo (2014-04-22 15:40:00) [21]>Почему 4 байта переменной Buf
размер указателя - 4 байта, в него пишутся байты 100 - 103
>и значениями 104-107
а эти значения будут писаться по следующему адресу, где, скорее всего, лежит следующая локальная переменная Data_Buf
>И почему с четвертого по седьмой шаг указатель носится по дебрям памяти?
Первый байт Data_Buf замещается на 104, после этого прибавляется единица, и т.д.
Who_are_you? (2014-04-22 14:51:00) [22]MBo © (22.04.14 12:15) [3]
New(Data_Buf);
выделяется один байт, его адрес в Data_Buf
Data_Buf:=@Buf;
но тот адрес теряется, утечка памяти, а Data_Buf теперь указатель на указатель (неинициализированный, но его адресуемая память тут и не используется), т.е. на некую область стека (локальные данные процедуры)
for ct:=0 to 10 do // заполнение массива
begin
Data_Buf^:= ct+100; //
inc (Data_Buf);
end;
заполняются четыре байта переменной Buf
заполняются четыре байта переменной Data_Buf !! самого указателя! значениями 104-107
т.е. с четвертого по седьмой шаг указатель носится по дебрям памяти. Скорее всего, должны быть AV
??????????
Почему 4 байта переменной Buf и значениями 104-107, где об этом сказано?
И почему с четвертого по седьмой шаг указатель носится по дебрям памяти?
MBo (2014-04-22 14:46:00) [23]Если доступ к элементам частый, а длина меняется редко, то выгоднее динамический массив.
Если длина меняется часто - удобнее будет список.
Элементы массива или списка тоже могут быть массивами или списками.
Лучше описать реальную задачу, тогда советы будут конкретнее.
Who_are_you? (2014-04-22 14:46:00) [24]А зачем вообще все это?
C динамическими переменными комп работате в N раз быстрее.
Я хочу, чтобы массив имел динамический размер, чтобы меньше занимать памяти для слабых старых компьютеров.
Раньше я делал так:
type
D_B = array[0..4096] of byte; { массив для вывода }
var
Data_Buf : ^D_B; // динамический массив
DataBuf_FT : array[0..4096] of byte; //
ct,i_rd : Longint;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
for ct:=0 to 4096 do DataBuf_FT[i_rd]:= 0;
New(Data_Buf);
for ct:=0 to 10 do // заполнение массива
begin
Data_Buf^[ct]:= ct+100; //
end;
for i_rd:=0 to 4096 do // чтение массива
begin
DataBuf_FT[i_rd]:= Data_Buf^[i_rd];
end;
Dispose(Data_Buf);
end;
Германн (2014-04-22 13:50:00) [25]
> Who_are_you? © (22.04.14 13:04) [4]
>
> Из ответа MBo:
> я понял так, что нужно все выбросить и определить
А зачем вообще все это?
junglecat (2014-04-22 13:07:00) [26]> как сделать, чтобы элементы массива Data_Buf[i_rd] были
> тоже динамическими
array of array of byte?
Who_are_you? (2014-04-22 13:04:00) [27]Из ответа MBo:
я понял так, что нужно все выбросить и определить
var
Data_Buf :array of byte; // динамический массив
begin
for ct:=0 to 4096 do DataBuf_FT[i_rd]:= 0;
SetLength(Data_Buf,4096); // или 4096 менять на 100
// хотелось чтобы размер менялся по ходу заполнения
for ct:=0 to 10 do // заполнение массива
begin
Data_Buf[ct]:= ct+100; //
end;
for i_rd:=0 to 4096 do // чтение массива
begin
DataBuf_FT[i_rd]:= Data_Buf[i_rd];
end;
end;
Но как сделать, чтобы элементы массива Data_Buf[i_rd] были тоже динамическими Data_Buf^[i_rd] ?
MBo (2014-04-22 12:15:00) [28]New(Data_Buf);
выделяется один байт, его адрес в Data_Buf
Data_Buf:=@Buf;
но тот адрес теряется, утечка памяти, а Data_Buf теперь указатель на указатель (неинициализированный, но его адресуемая память тут и не используется), т.е. на некую область стека (локальные данные процедуры)
for ct:=0 to 10 do // заполнение массива
begin
Data_Buf^:= ct+100; //
inc (Data_Buf);
end;
заполняются четыре байта переменной Buf
заполняются четыре байта переменной Data_Buf !! самого указателя! значениями 104-107
т.е. с четвертого по седьмой шаг указатель носится по дебрям памяти. Скорее всего, должны быть AV
Data_Buf:=@Buf;
теперь указатель снова указывает на стек
DataBuf_FT[i_rd]:= Data_Buf^;
а здесь читается из всяких разных адресов
Dispose(Data_Buf);
попытка освобождения невесть чего
sniknik (2014-04-22 11:53:00) [29]> - лучше определить размер или лучше указать просто array of byte;
динамический массив гораздо удобнее чем самостоятельное выделение памяти под массив/указатели... раньше, в паскале когда не было динамических, именно так и делали. а сейчас зачем "париться"?
junglecat (2014-04-22 11:50:00) [30]array of byte + SetLength