Добро пожаловать!

Я Дож, программирование — моё хобби. По мере того, как я осваиваю что-то новое, стараюсь об этом написать пост.
На текущий момент в блоге затронуты следующие темы: vim, free pascal, lisp, forth, m4
Занимаюсь разработкой своего языка под названием DEmbro, подбробней: wiki и svn
Для постов, не связанных с программированием, у меня есть отдельное жж.

мая 27, 2009

Проблема с property record'ом

Имеем код


type
TVec2f = packed record
  X, Y: Single;
end;

TClass = class
private
  FVec: TVec2f;
  procedure SetVec(V: TVec2f);
public
  property Vec: TVec2f read FVec write SetVec;
end;
  
procedure TClass.SetVec(V: TVec2f);
begin
  FVec := V;
  Writeln(V.X, ' ', V.Y);
end;

var
  Obj: TClass;
  V: TVec2f;
begin
  Obj := TClass.Create;
  V.X := 100;
  V.Y := 1000;
  Obj.Vec := V;
  Obj.Vec.Y := 666;
  Writeln('Last value: ', Obj.Vec.Y);
end.


Код прекрасно компилируется. Вся соль в предпоследней строке Obj.Vec.Y := 666. Возникает несколько вопросов
1) Будет ли вызван Writeln при выполнении этой строки?
2) Что будет напечатано в самом конце?

Ответы

1) Нет
2) "Last value: 6.660000000E+02"

Из-за этого совершенно неочевидного поведения я просидел в поисках ошибки в одной своей программе около часа.

Далее, если в этом же коде убрать "read FVec" и "Writeln('Last value: ', Obj.Vec.Y);", то компилятор будет ругаться на строку "Obj.Vec.Y := 666;".

От нас что-то скрывают! :)

Видимо, теперь record ведет себя как класс. В предыдущих версиях фпц такой код вообще не компилировался.


Читать дальше......

FPC 2.2.4

Полтора месяца прошло с появления FPC 2.2.4. С паскалем я, к сожалению, все это время дела не имел (использовал CodeGear Delphi 2009), а вот сегодня наконец пришлось.

Полный лог изменений в FPC 2.2.4.

Самое значимое - это полноценная поддержка generic'ов. А этого я ждал долго :) Теоретически, они были и раньше, но по факту при попытке специализации какого-то дженерика вываливалась ошибка "202 runtime error".

В скором времени перепишу паскалевский синтаксис в виме, чтобы слова generic и specialize подсвечивались.

Код с тестовым примером:


generic TList<TItem> = class(TObject)
var private
  FItems: Array Of TItem;
public
  procedure SetLength(Len: Integer); inline;
  function High: Integer; inline;
  function Length: Integer; inline;
  procedure Add(Item: TItem);
  procedure Del(Item: TItem; All: Boolean = True);
  function Find(Item: TItem): Integer;
  function GetItem(Index: Integer): TItem; inline;
  procedure SetItem(Index: Integer; Item: TItem); inline;
  property Items[Index: Integer]: TItem read GetItem write SetItem; default;
end;
TListOfInteger = specialize TList<Integer>;
TListOfString = specialize TList<String>;



Читать дальше......

мая 03, 2009

Перерисовка окна

Иногда в виме окно оказывается замусоренным. Может помочь скроллинг вверх/вниз, но это не всегдая удобно. Более удобный способ - вызвать принудительную перерисовку:
      :redr!


Читать дальше......

Постоянные читатели

Обо мне

Моя фотография
Мой e-mail: vitek_03(at)mail(dot)ru