Запись как массив
Модератор: Модераторы
Запись как массив
Как реализовать такой тип данных, содержащий два вещественных числа, чтоб к переменной этого типа можно было обращаться и как к записи с двумя полями, и как к массиву из двух вещественных чисел, например
vec.x равносильно vec[0]
vec.y равносильно vec[1]
???
vec.x равносильно vec[0]
vec.y равносильно vec[1]
???
написать класс с соответствующими свойствами
Например так:
Код: Выделить всё
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;Класс для двух флоатов? а жирно не будет?
Можно использовать запись с вариантами, только позаботится чтобы выравнивание не мешало.
Можно использовать запись с вариантами, только позаботится чтобы выравнивание не мешало.
ну так а для чего придуман тип object? всё то же, что предложил Mr.Smart, только с ключевым словом object, и будет самое то
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.
А можно привести обращение к элементам записи к виду vec[n], наподобие того, как это делается со свойствами класса, помеченными директивой default?
Ferrum писал(а):А можно привести обращение к элементам записи к виду vec[n], наподобие того, как это делается со свойствами класса, помеченными директивой default?
нет.
но ты оставь запрос в bugs.freepascal.org
я что то не понял в вопросе, или уважаемый Ferrum не знает о case в объявлении записи?
Туплю, скалогрыз уже ответил
Туплю, скалогрыз уже ответил
-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
Можно ещё разместить одну переменную по адресу второй.
Но этот вариант хуже тем, что труднее разбираться в программе, т.к. такое объединение видно только при объявлении.
Код: Выделить всё
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.
Но этот вариант хуже тем, что труднее разбираться в программе, т.к. такое объединение видно только при объявлении.
вроде бы в FPC.2.4.0 такие конструкции запретили
Ferrum писал(а):А можно привести обращение к элементам записи к виду vec[n], наподобие того, как это делается со свойствами класса, помеченными директивой default?
если будеш использовать object то вроде можно, но имхо ето зло, это ведь стандарт дельфи а не паскаля. имхо лучше таки обойтись без default а явно указывать какие значения надо получать.
Спасибо за ответы
