![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непойму в чем ошибка при выделении памяти с помощю 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 должен бы инициализировать структуру...