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

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

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

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

Сообщение Ferrum » 29.06.2010 10:55:09

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

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

Сообщение Light13 » 29.06.2010 11:11:33

написать класс с соответствующими свойствами
Аватара пользователя
Light13
постоялец
 
Сообщения: 127
Зарегистрирован: 17.07.2009 07:50:10
Откуда: Челябинск

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

Сообщение Mr.Smart » 29.06.2010 11:20:43

Например так:
Код: Выделить всё
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;
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение zub » 29.06.2010 12:59:12

Класс для двух флоатов? а жирно не будет?
Можно использовать запись с вариантами, только позаботится чтобы выравнивание не мешало.
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение hinst » 29.06.2010 14:09:14

ну так а для чего придуман тип object? всё то же, что предложил Mr.Smart, только с ключевым словом object, и будет самое то
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

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

Сообщение скалогрыз » 29.06.2010 16:39:09

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.


скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение Ferrum » 29.06.2010 19:35:28

А можно привести обращение к элементам записи к виду vec[n], наподобие того, как это делается со свойствами класса, помеченными директивой default?
Аватара пользователя
Ferrum
новенький
 
Сообщения: 14
Зарегистрирован: 27.08.2009 10:11:53

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

Сообщение скалогрыз » 29.06.2010 20:15:50

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

нет.

но ты оставь запрос в bugs.freepascal.org
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение Timid » 30.06.2010 09:15:32

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

Туплю, скалогрыз уже ответил :)
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

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

Сообщение SAK » 01.07.2010 13:08:06

Можно ещё разместить одну переменную по адресу второй.
Код: Выделить всё
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.

Но этот вариант хуже тем, что труднее разбираться в программе, т.к. такое объединение видно только при объявлении.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

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

Сообщение hinst » 01.07.2010 13:41:05

вроде бы в FPC.2.4.0 такие конструкции запретили
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

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

Сообщение alexrayne » 02.07.2010 13:58:06

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

если будеш использовать object то вроде можно, но имхо ето зло, это ведь стандарт дельфи а не паскаля. имхо лучше таки обойтись без default а явно указывать какие значения надо получать.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

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

Сообщение Ferrum » 03.07.2010 08:35:56

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

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

Сообщение SAK » 04.07.2010 14:38:39

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

Как раз на 2.4.0 проверял - работает.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru