хитрое наследование object'ов

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Сообщение zub » 16.12.2005 03:03:29

Поясните пожалуйста что FPC 2.0 добавляет на границе наследования object'ов
вот небольшой примерчик:

program test2;
uses
log,strings,sysutils;
type tobj1=object
first:double;

procedure blabla;virtual;abstract;
end;
tobj2=object(tobj1)
second:double;
end;
var obj:tobj2;
begin
programlog.logout('@first=$'+inttohex(longword(@obj.first),8));
programlog.logout('@second=$'+inttohex(longword(@obj.second),8));
programlog.done;
end.

в логе видим пропажу 8ми байтов, выравнивание вроде тут нипричем:
@first=$00418000
@second=$00418010

если second перекинуть в tobj1 тогда всё нормально:
@first=$00418000
@second=$00418008

в реальной программе разница еще больше (здесь infrustum:boolean последний элемент родительского объекта, ObjMatrix - первый наследуемого)
PGDBObjCircle.infrustum=$0248922E
PGDBObjCircle.ObjMatrix=$02489248

Нужно для runtime доступа к полям объектов из скриптов, в delphi все вроде работает, в fp соответственно нет :((
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Сообщение zub » 17.12.2005 20:22:53

Пустил по ложному следу, проблема не в обжектах, в примере я не учел указатель на VMT, там в памяти получается first,PVMT,second, с выравниванием какраз набегает 8 байт.

Новый пример с глюком:

Код: Выделить всё
program test2;
{$APPTYPE CONSOLE}
uses
 sysutils;
type
//DVector4D=array[0..3]of double;
DVector4D=record e0,e1,e2,e3:double; end;
DMatrix4D=array[0..3]of DVector4D;
GDBObjVisible=record
                   infrustum:boolean;
                   ObjMatrix:DMatrix4D;
             end;
var obj:GDBObjVisible;
begin
 writeln('@obj=                $'+inttohex(longword(@obj),8));
 writeln('@obj.infrustum=      $'+inttohex(longword(@obj.infrustum),8));
 writeln('@obj.objmatrix=      $'+inttohex(longword(@obj.objmatrix),8));
 writeln('@obj.objmatrix[0]=   $'+inttohex(longword(@obj.objmatrix[0]),8));
 writeln('@obj.objmatrix[1]=   $'+inttohex(longword(@obj.objmatrix[1]),8));
 writeln('@obj.objmatrix[2]=   $'+inttohex(longword(@obj.objmatrix[2]),8));
 writeln('@obj.objmatrix[3]=   $'+inttohex(longword(@obj.objmatrix[3]),8));
end.

Компилирую FPC 2.0
c DVector4D=record e0,e1,e2,e3:double; end;
получаю
@obj= $00414000
@obj.infrustum= $00414000
@obj.objmatrix= $00414004
@obj.objmatrix[0]= $00414004
@obj.objmatrix[1]= $00414024
@obj.objmatrix[2]= $00414044
@obj.objmatrix[3]= $00414064

c DVector4D=array[0..3]of double;
получаю
@obj= $00414000
@obj.infrustum= $00414000
@obj.objmatrix= $00414020
@obj.objmatrix[0]= $00414020
@obj.objmatrix[1]= $00414040
@obj.objmatrix[2]= $00414060
@obj.objmatrix[3]= $00414080

Что за глюк с вложенными массивами? или это какаято особенность выравнивания?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Сообщение STAKANOV » 18.12.2005 15:20:37

попробуй packed array и packed record
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 81

Рейтинг@Mail.ru