Запись как массив

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

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

Ответить
Аватара пользователя
Ferrum
новенький
Сообщения: 14
Зарегистрирован: 27.08.2009 10:11:53

Запись как массив

Сообщение Ferrum »

Как реализовать такой тип данных, содержащий два вещественных числа, чтоб к переменной этого типа можно было обращаться и как к записи с двумя полями, и как к массиву из двух вещественных чисел, например
vec.x равносильно vec[0]
vec.y равносильно vec[1]
???
Аватара пользователя
Light13
постоялец
Сообщения: 127
Зарегистрирован: 17.07.2009 07:50:10
Откуда: Челябинск

Сообщение Light13 »

написать класс с соответствующими свойствами
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Например так:

Код: Выделить всё

type

  { TVec }

  TVec = class
  private
    function GetItem(const Index: Integer): Double;
    procedure SetItem(const Index: Integer; const aValue: Double);
  private
    fx, fy: Double;
  property
    property x: Double read fx write fx;
    property y: Double read fy write fy;
    property Items[const Index: Integer]: Double read GetItem write SetItem; default;
  end;

implementation

{ TVec }

function TVec.GetItem(const Index: Integer): Double;
begin
  case Index of
   0: Result:=fx;
   1: Result:=fy;
   else raise Exception.Create('Error');
  end;
end;

procedure TVec.SetItem(const Index: Integer; const aValue: Double);
begin
  case Index of
   0: fx:=aValue;
   1: fy:=aValue;
   else raise Exception.Create('Error');
  end;
end;
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Класс для двух флоатов? а жирно не будет?
Можно использовать запись с вариантами, только позаботится чтобы выравнивание не мешало.
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

ну так а для чего придуман тип object? всё то же, что предложил Mr.Smart, только с ключевым словом object, и будет самое то
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

Ferrum писал(а):Как реализовать такой тип данных, содержащий два вещественных числа, чтоб к переменной этого типа можно было обращаться и как к записи с двумя полями, и как к массиву из двух вещественных чисел, например
vec.x равносильно vec[0]
vec.y равносильно vec[1]
???


Код: Выделить всё

type
  TVec = record
  case byte of
  0: (x, y: double);
  1: (a: array [0..1] of double);
  end;

var
  v : TVec;

begin
  v.x:=0;
  v.y:=1;
  writeln(v.a[0], ' ',v.a[1]);
  writeln(' sizeof = ', sizeof(TVec));
end.


Аватара пользователя
Ferrum
новенький
Сообщения: 14
Зарегистрирован: 27.08.2009 10:11:53

Сообщение Ferrum »

А можно привести обращение к элементам записи к виду vec[n], наподобие того, как это делается со свойствами класса, помеченными директивой default?
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

Ferrum писал(а):А можно привести обращение к элементам записи к виду vec[n], наподобие того, как это делается со свойствами класса, помеченными директивой default?

нет.

но ты оставь запрос в bugs.freepascal.org
Timid
постоялец
Сообщения: 290
Зарегистрирован: 21.11.2007 20:33:15

Сообщение Timid »

я что то не понял в вопросе, или уважаемый Ferrum не знает о case в объявлении записи?

Туплю, скалогрыз уже ответил :)
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

Можно ещё разместить одну переменную по адресу второй.

Код: Выделить всё

var 
    vr: record a, b: double end;
    vm: array[0..1] of double absolute vr;
begin
   vr.a:=2; vr.b:=3;
   writeln(vm[0], ' ', vm[1])
end.

Но этот вариант хуже тем, что труднее разбираться в программе, т.к. такое объединение видно только при объявлении.
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

вроде бы в FPC.2.4.0 такие конструкции запретили
alexrayne
постоялец
Сообщения: 125
Зарегистрирован: 03.12.2008 15:56:26

Сообщение alexrayne »

Ferrum писал(а):А можно привести обращение к элементам записи к виду vec[n], наподобие того, как это делается со свойствами класса, помеченными директивой default?

если будеш использовать object то вроде можно, но имхо ето зло, это ведь стандарт дельфи а не паскаля. имхо лучше таки обойтись без default а явно указывать какие значения надо получать.
Аватара пользователя
Ferrum
новенький
Сообщения: 14
Зарегистрирован: 27.08.2009 10:11:53

Сообщение Ferrum »

Спасибо за ответы
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

hinst писал(а):вроде бы в FPC.2.4.0 такие конструкции запретили

Как раз на 2.4.0 проверял - работает.
Ответить