![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Возможно, все дело в рекурсии. При разбивки, возможно, поменялась логика рекурсии и она начала работать несколько по другому. 
		
	
		
		
		
		
		
	
		
		
	
	
	 |