Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.06.2007, 06:32
overall overall вне форума
Прохожий
 
Регистрация: 17.06.2007
Сообщения: 1
Репутация: 10
По умолчанию Разбил процедуру на две. В результате - ошибка!

Здравствуйте. Вот такая вот фигня у меня. Уже третий день сижу мучаюсь не могу понять, где что не так.

Была процедура следующего вида:

Весь код не привожу, больно большой.

Код:
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  
Старый 17.06.2007, 19:56
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Возможно, все дело в рекурсии. При разбивки, возможно, поменялась логика рекурсии и она начала работать несколько по другому.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter