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

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

распределение памяти в динмаическом массиве записей


Страницы:   1 2

Nil ©   (2007-12-06 14:47:00) 

С виду тревиальная задача: нужен динамический массив элементами которго являются записи. Вот что я налабал:

const
 MAXDRVCOUNT=1000;

type
 pDrvRec = ^TDrvRec;
 TDrvRec=record
   ClassName,
   ClassGUID,
   DevName,
   HardwareID,
   CompatibleIDS,
   DeviceClassName,
   Manufacturer,
   FriendlyName,
   DriverDate,
   ProviderName,
   DriverVersion,
   DriverDesc: string[255];
   ClassIm: integer;
 end;

 PDrvArr = ^TDrvArr;
 TDrvArr = array [1..MAXDRVCOUNT] of pDrvRec;

 public
   { Public declarations }

   DrvList: pDrvArr;

.................

 for I := 1 to 100 do
 begin
   ReAllocMem(MainForm.DrvList,i*sizeof(TDrvRec)+4);
   MainForm.DrvList[i]^.ClassName:= 'Hello'; - вот здесь AcessViolation
 end;


не понятно почему ошибка возникает на 3-м шаге цикла. подскажите пож где грабли?

заранее благодарен


Palladin   (2007-12-06 15:45:00) [21]

const
MAXDRVCOUNT=1000;

type
pDrvRec = ^TDrvRec;
TDrvRec=record
  ClassName,
  ClassGUID,
  DevName,
  HardwareID,
  CompatibleIDS,
  DeviceClassName,
  Manufacturer,
  FriendlyName,
  DriverDate,
  ProviderName,
  DriverVersion,
  DriverDesc: string[255];
  ClassIm: integer;
end;

PDrvArr = ^TDrvArr;
TDrvArr = array [1..MAXDRVCOUNT] of pDrvRec; // размер элемента массива = SizeOf(pDrvRec)

public
  { Public declarations }

  DrvList: pDrvArr;

.................

for I := 1 to 100 do
begin
  ReAllocMem(MainForm.DrvList,i*sizeof(TDrvRec)+4); // почему делаем реаллок по размеру SizeOf(TDrvRec) да еще +4

  MainForm.DrvList[i]^.ClassName:= 'Hello'; - вот здесь AcessViolation // почему обращаемся к неинициализированному указателю?
end;


Nil   (2007-12-06 15:43:00) [22]

> Сергей М.
спасибо что заметили!!
обратите внимание на тему "нужен динамический массив" а не "есть динамический массив"
а по существу вопроса можете что нибудь предложить, кроме того что вы увидели [1..MAXDRVCOUNT]?


Германн   (2007-12-06 15:41:00) [23]


> В "налабанном" динамическим массивом и не пахнет.

В "налабанном" пахнет граблями, что автор и сам признал. А не надо бездумно тащить из тырнета всё то барахло, которое там валяется с незапамятных времен.


Сергей М.   (2007-12-06 15:32:00) [24]


> нужен динамический массив


> Вот что я налабал


В "налабанном" динамическим массивом и не пахнет.


Германн   (2007-12-06 15:20:00) [25]

Ну разве что для ТП.


Nil   (2007-12-06 15:19:00) [26]

> Dib@zol
увидел скелет в каком то примере ну и развил его до своей задачи
а под Finalize что подразумевается?


Юрий Зотов   (2007-12-06 15:00:00) [27]

> Nil   (06.12.07 14:47)

Да... понакручено. Указатель на массив указателей....

Зачем усложнять жизнь самому себе? Если нужен динамический масив, так динамический массив и используйте, без всякого мудрежа.


Dib@zol   (2007-12-06 14:50:00) [28]

А не легше ли так:
DrvList:array of TDrvRec + SetLength + Finalize
???


Страницы:   1 2

Наверх

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