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

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

Непойму в чем ошибка при выделении памяти с помощю SetLength?


Erik1 ©   (2005-06-09 18:05:00) 

У меня есть record:
 Rfield = record
   name: ShortString;
   value: ShortString;
 end;
 FieldItem = array of Rfield;
 PFieldItem = ^FieldItem;
 REquipment = record
   id: Integer;
   Send: TJvServer;
   Error: ShortString;
   tyyp: ShortString;
   mac: ShortString;
   cmd: ShortString;
   field: FieldItem;
 end;
 PointDev = ^REquipment;
Так же имеется переменая var Seade: PointDev; я создаю ее New(Seade) и работяю с ней.
 New(Seade);
 try
   Seade.tyyp := 'MTA';
   Seade.mac := cValue;
   Seade.id := Raw.Element.ID;
   Seade.cmd := cCmd;
   Seade.Send := srvDHCP;
   with Seade^ do
    if (sCmd = sendAdd) then
     begin
       SetLength(field, 9); -- на этой строке вылетает ошибка
...
Вылетает Access Violation с показам регистров и asm кода, в чем может быть дело?


chelovek   (2005-06-10 12:53:00) [1]

через IIF неучем, что оба параметра вычмсляются...   вознокалавыше указаная ошибка. Данная возникала прииспользовании библиотеки DeCAL.
:)


Erik1   (2005-06-10 12:22:00) [2]

'Странное объявление... зачем PFieldItem?' я всегда с запасом обявления делаю, бывает удобно оперировать внутренеми полями, да и передача сылок надежнее работает чем Var.
 Ошибку нашел, вопрос снят. А была она в другом месте при обращении к объекту через IIF неучем, что оба параметра вычмсляются. После повторного запуска програмы без выгрузки среды, вознокала выше указаная ошибка. Данная возникала при использовании библиотеки DeCAL.


Sapersky   (2005-06-10 11:47:00) [3]

FieldItem = array of Rfield;
PFieldItem = ^FieldItem;


Странное объявление... зачем PFieldItem?


evvcom   (2005-06-10 09:09:00) [4]

> FillChar(CallCmd[0], SizeOf(CallCmd[0])* Length(CallCmd), sendNone);
Хотя это на интересующую ошибку никак не повлияет.
Неясно, что такое Element и CallCmd и где они объявлены.


PVOzerski   (2005-06-09 21:19:00) [5]

Не надо использовать вместо Dispose FreeMem, коль уж память выделена через New! Рискуешь не выполнить финализацию для полей, которые в этом нуждаются. BTW, ты часом указатели вместо того, на что они указывают, FillChar'ом не обнулил? Переменная типа класс - тоже указатель.


Erik1   (2005-06-09 21:16:00) [6]

Так ошибка происходит до Dispose и выделается память через New.


-=S.S=-   (2005-06-09 21:13:00) [7]

Вместо Dispose попробуй использовать FreeMemory


Erik1   (2005-06-09 20:08:00) [8]

Разве, что так:
FillChar(Element, SizeOf(Element), 0);
Element.Parent_ID := -1;

constructor TRawLink.Create;
begin
 inherited;
 FillChar(Element, SizeOf(Element), 0);
 FillChar(CallCmd[0], SizeOf(CallCmd[0])*High(CallCmd), sendNone);


PVOzerski   (2005-06-09 19:13:00) [9]

Ты нигде не залезаешь за пределы выделенных динамически блоков памяти или границы статических массивов? Особое внимание - на параметры циклов, процедуры Move и FillChar.


Erik1   (2005-06-09 19:00:00) [10]

Да я понимаю, что код должен работать. Я есть едеи как найти проблему, дело в том, что я почти неработаю с динамической памятью. Только New и Dispose заканчивается этот кусок так:
 except
   Dispose(Seade);
   Raise;
 end;
 Raw.Container.Data.Add(Seade);


PVOzerski   (2005-06-09 18:36:00) [11]

Ты знаешь, похоже, источник проблемы в некорректном работе с динамической памятью где-то в другом месте программы. Я прогнал твой кусок (с минимальными изъятиями) в D6, проблем не возникло.


Erik1   (2005-06-09 18:30:00) [12]

Привожу asm:
push $09
mov eax,[ebp-$30]
add eax,$408
mov ecx,$$1
mov edx,[$004ce434]
call @DynArraySetLength
add esp,$04
Вылетает гдето внутри пр обращении к memory Manager.


Erik1   (2005-06-09 18:23:00) [13]

Я пробовал вызывать Length(Field) выдает 0. Неужели придется с asm кодом разбиратся?


PVOzerski   (2005-06-09 18:13:00) [14]

Для интереса, посмотри перед вызовом SetLength, nil ли значение поля field. Хотя это странно, по идее New должен бы инициализировать структуру...


Наверх

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