Текущий архив: 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.48 MB
Время: 0.037 c