Длина массива, различие в Delphi и FPC[Решено]
Добавлено: 15.03.2011 15:11:26
Динамический массив, область памяти, на которую указывает переменная данного типа. Но это так же чуть больше чем просто массив, у динамического есть еще длина и счетчик ссылок.
Так вот скажем процедура Length возвращает длину массива и в Delphi и в FPC одну и туже Ура.
Когда же мы пытаемся узнать ее средствами ASM, тобишь копаясь в памяти, я получил такую не приятную вещь, FPC хранит в памяти где лежит Length, число которое меньше чем вернет процедура Length на 1.
Предположим имеем такой тип данных:
Напишем процедуру тестирования:
Где процедура Len написана нами на асме:
Для Delphi 2009:
И для FPC:
Проводим тест, и получаем результат:
Delphi: Length(D1)=5, Len(D1)=5.
FPC: Length(D1)=5, Len(D1)=4.
Вопрос: Почему?
Lazarus 0.9.29 FPC 2.4.2.
Так вот скажем процедура Length возвращает длину массива и в Delphi и в FPC одну и туже Ура.
Когда же мы пытаемся узнать ее средствами ASM, тобишь копаясь в памяти, я получил такую не приятную вещь, FPC хранит в памяти где лежит Length, число которое меньше чем вернет процедура Length на 1.
Предположим имеем такой тип данных:
- Код: Выделить всё
TIntArray2 = array of integer;
Напишем процедуру тестирования:
- Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var D1:TIntArray2;
begin
SetLength(D1,5);
caption:=IntToStr(Len(D1))+' '+IntToStr(Length(D1));
end;
Где процедура Len написана нами на асме:
Для Delphi 2009:
- Код: Выделить всё
function Len(var D:TIntArray2):Integer; register;assembler;
asm
mov eax,[eax]
mov eax,[eax-4]
end;
И для FPC:
- Код: Выделить всё
function Len(var D:TIntArray2):Integer; register;assembler;
{$ASMMODE intel}
asm
mov eax,[eax]
mov eax,[eax-4]
end;
Проводим тест, и получаем результат:
Delphi: Length(D1)=5, Len(D1)=5.
FPC: Length(D1)=5, Len(D1)=4.
Вопрос: Почему?
Lazarus 0.9.29 FPC 2.4.2.