Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

AV при выполнении метода TObjectList.Sort


Страницы:   1 2 3

Rule ©   (2006-10-25 13:36:00) 

не пойму почему выходит AV, сам AV происходит в процедуре сортировки, значит вызываю процедуру таким образом   Columns.Sort(dmCommon.MethodAddress('ComparePosColumnsObjects'));
сама прцедруа сортировки такова
function TdmCommon.ComparePosColumnsObjects(Item1,
 Item2: Pointer): Integer;
begin
 Result := TEntityColumn(Item1).Pos-TEntityColumn(Item2).Pos
end;
трассировка показала, что TEntityColumn(Item1).Pos - нормальный, а TEntityColumn(Item2).Pos - недоступное значение ...
я думал что в списке есть указатели на несуществующие объекты, но перед вызовом сортировки непосредственно (перед Columns.Sort(dmCommon.MethodAddress('ComparePosColumnsObjects'));) я написал вот такой код
 for i:= 0  to Columns.Count-1 do Dialogs.ShowMessage(IntToStr(TEntityColumn(Columns[i]).Pos));
и он отработал нормально, значит несуществующих объектов у меня нет ....
подскажите куда ещё можно копать
ЗЫ: код работал нормально вроде, хотя у меня уже сомнения по этому поводу ... но в этой части кода я не ковырял вообще ....
спасибо всем за внимание ...


MetalFan_pda   (2006-10-25 23:44:00) [21]

приведеннный код сперт из библиотеки mad... (madTools.pas) работоспособность не проверял


Ketmar   (2006-10-25 21:07:00) [22]

>[31] default(c) 25-Oct-2006, 20:53
лучше бы он не знал об интернете.


default   (2006-10-25 20:53:00) [23]

Ketmar ©   (25.10.06 20:37) [30]
это да
ну если бы он вообще не знал о ассеблере, то такая бы бредятина не увидела бы свет


Ketmar   (2006-10-25 20:37:00) [24]

>[29] default(c) 25-Oct-2006, 20:19
>пример того, что лишние знания иногда вредят:)
знания -- вряд ли. что-то я у того, кто это написал, знанийне замечаю. только умение находить себе проблемы на анус.

2MetalFan: не ройся больше в помойках. там ещё и не такой мусор можно найти. %-)


default   (2006-10-25 20:19:00) [25]

ещё и обход дельфийского менеджера памяти:)
не код, а ужас
пример того, что лишние знания иногда вредят:)
в данном случае - знание ассемблера:)


Ketmar   (2006-10-25 20:08:00) [26]

а что тут тестить? и так видно, что бредятина.


Rule   (2006-10-25 19:33:00) [27]

а щас проверим ...


Ketmar   (2006-10-25 15:48:00) [28]

>[25] MetalFan(c) 25-Oct-2006, 15:43
>кто чего скажет? может кто протестит?
может, сам и протестишь? %-)


MetalFan   (2006-10-25 15:43:00) [29]

попалась интересная функция:
function MethodToProcedure(self: TObject; methodAddr: pointer) : pointer;
type
 TMethodToProc = packed record
   popEax   : byte;                  // $58      pop EAX
   pushSelf : record                 //          push self
                opcode  : byte;      // $B8
                self    : pointer;   // self
              end;
   pushEax  : byte;                  // $50      push EAX
   jump     : record                 //          jmp [target]
                opcode  : byte;      // $FF
                modRm   : byte;      // $25
                pTarget : ^pointer;  // @target
                target  : pointer;   //          @MethodAddr
              end;
 end;
var mtp : ^TMethodToProc absolute result;
begin
 mtp := VirtualAlloc(nil, sizeOf(mtp^), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
 with mtp^ do begin
   popEax          := $58;
   pushSelf.opcode := $68;
   pushSelf.self   := self;
   pushEax         := $50;
   jump.opcode     := $FF;
   jump.modRm      := $25;
   jump.pTarget    := @jump.target;
   jump.target     := methodAddr;
 end;
end;

кто чего скажет? может кто протестит?


Rule   (2006-10-25 14:57:00) [30]

Сергей М. ©   (25.10.06 14:17) [23]
спасибо за подробные разьяснения, буду впредь внимательней ...


Сергей М.   (2006-10-25 14:17:00) [31]


> Rule


какой нафиг "стек" ?

соглашение - дифолтное

Первые три параметра - в РОН, остальные - в стек.

TListSortCompare - рег.ф-ция, с двумя параметрами.

Item1 ожидается в EAX, Item2  - в EDX.

Если же ты подставишь адрес не рег.ф-ции, а функц.метода класса, то этот функц.метод класса будет ожидать в EAX не Item1, а self .. дальше и объяснять не надо, дальше - бардак


Palladin   (2006-10-25 14:12:00) [32]

не в принципе, а реально


Rule   (2006-10-25 14:06:00) [33]

Джо ©   (25.10.06 14:02) [20]
а ну да в принципе ...


Джо   (2006-10-25 14:02:00) [34]

> перечитал хэлп, про то что это должна быть регулярная функция
> ничего не сказано ...

Дык смотри определение:
procedure Sort(Compare: TListSortCompare);
type
TListSortCompare = function (Item1, Item2: Pointer): Integer; // of object не указано.


Джо   (2006-10-25 14:01:00) [35]

Не, с порядком я напутал. Передаваться будет так:
Вместо A -> B
Вместо B -> Self (нулевой).
Вместо Self -> Вообще хрен знает что.

Вроде так. Жаль, сейчас нет времени поразмыслить, убегаю...


pasha_golub   (2006-10-25 14:00:00) [36]


> Сергей М. ©   (25.10.06 13:49) [10]

Не такой уж и простой вопрос, чтобы в Начинающих его.


Rule   (2006-10-25 14:00:00) [37]

огромное всем спасибо :-) получилось вроде, ща потестю нормально ... перечитал хэлп, про то что это должна быть регулярная функция ничего не сказано ...


Rule   (2006-10-25 13:54:00) [38]

тогда интересует вопрос как оно могло раньше все работать ... я то был уверен что ему не обязательно регулярная функция нужна была ...


Rule   (2006-10-25 13:53:00) [39]

так чтото я перерабтался ... помоему начинаю въезжать где я промазнулся ...


Джо   (2006-10-25 13:52:00) [40]

В итоге, когда ты такое проделываешь, то в Sort попадает:
Вместо A -> Self (неверный)
Вместо B -> A
И еще лишний параметр B, отсюда, видимо, и AV при нарушении стека.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо