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

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

Начало и размер буфера динамической переменной [D7, 95/98, XP]


Страницы:   1 2

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


Страницы:   1 2

Наверх

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