Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

Непойму в чем ошибка при выделении памяти с помощю 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.045 c
3-1117609509
Andy BitOff
2005-06-01 11:05
2005.07.11
Запрос на выборку не повторяющихся записей.


1-1118396545
Ega23
2005-06-10 13:42
2005.07.11
Реализация TDataLink у Борланда: непонятки


9-1112119855
Bret
2005-03-29 22:10
2005.07.11
DCE


3-1116930121
FunkyByte
2005-05-24 14:22
2005.07.11
Какие есть классы для доступа к dbf-таблицам без ADO и пр.


1-1118604619
Tigraman
2005-06-12 23:30
2005.07.11
Про реестр





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский