Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

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

 
Erik1 ©   (2005-06-09 18:05) [0]

У меня есть 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 кода, в чем может быть дело?


 
PVOzerski ©   (2005-06-09 18:13) [1]

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


 
Erik1 ©   (2005-06-09 18:23) [2]

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


 
Erik1 ©   (2005-06-09 18:30) [3]

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


 
PVOzerski ©   (2005-06-09 18:36) [4]

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


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

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


 
PVOzerski ©   (2005-06-09 19:13) [6]

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


 
Erik1 ©   (2005-06-09 20:08) [7]

Разве, что так:
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);


 
-=S.S=- ©   (2005-06-09 21:13) [8]

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


 
Erik1 ©   (2005-06-09 21:16) [9]

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


 
PVOzerski ©   (2005-06-09 21:19) [10]

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


 
evvcom ©   (2005-06-10 09:09) [11]

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


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

FieldItem = array of Rfield;
PFieldItem = ^FieldItem;


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


 
Erik1 ©   (2005-06-10 12:22) [13]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.11 c
3-1117285895
Darkmaster
2005-05-28 17:11
2005.07.11
XML и сохранение базы


3-1116927000
msguns
2005-05-24 13:30
2005.07.11
Что нужно на клиенте для работы ADO+Access


14-1118643891
syte_ser78
2005-06-13 10:24
2005.07.11
Ответный код


1-1118776999
Knoxville
2005-06-14 23:23
2005.07.11
Поиск папок


6-1112672184
Zyb
2005-04-05 07:36
2005.07.11
Вопрос по сокетам