|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Разбил процедуру на две. В результате - ошибка!
Здравствуйте. Вот такая вот фигня у меня. Уже третий день сижу мучаюсь не могу понять, где что не так.
Была процедура следующего вида: Весь код не привожу, больно большой. Код:
procedure ReadItemsTo(...); var I: Integer; begin for I := 0 to ... do begin //Кусок кода #1 end; end; Разбил её на две, путем выноса из под цикла: Код:
function ReadItem(...): ...; begin //Кусок кода #1 end; procedure ReadItemsTo(...); var I: Integer; begin for I := 0 to ... do begin ... := ReadItem(...); end; end; Вынес правильно. В старой версии процедура рекурсивно вызывала саму себя. После разбивки соответственно рекурсия сохранилась, но опосредованно (ReadItemsTo -> ReadItem -> ReadItemsTo -> ReadItem -> ...). Компилится и работает, но в некоторых случаях возникает AV (Access Violation) в процедуре "DeleteFree()" в "getmem.inc" (системный модуль). Код:
procedure DeleteFree(f: PFree); var n, p: PFree; size: Integer; begin if rover = f then rover := f.next; n := f.next; size := f.size; if size <= cSmallSize then begin if n = f then smallTab[size div cAlign] := nil else begin smallTab[size div cAlign] := n; p := f.prev; n.prev := p; p.next := n; end; end else begin p := f.prev; n.prev := p; // Здесь!!! p.next := n; end; end; Всё это определенно очень странно. До разбития процедуры всё работало отлично без таких вот выкрутасов. Может это баг компилятора? (Пробовал и на Delphi 5 и на Delphi 6 - и там и там таже самая ошибка) Думаю, может что-то не так с выделением памяти, раз ошибка в DeleteFree (процедура стандартного менеджера памяти). Руками память не выделяю. Только создание и уничтожение объектов, ну и строки (длинные). Но если дело с памятью, то почему тогда всё отлично работает, когда процедура не разбита? Не понимаю... Подскажите, что-нибудь, пожалуйста! |
#2
|
|||
|
|||
Возможно, все дело в рекурсии. При разбивки, возможно, поменялась логика рекурсии и она начала работать несколько по другому.
|