ВУЗ:
Составители:
Рубрика:
38
Затем на каждой итерации цикла появляется еще один — результат ра-
боты метода Dot, — адрес которого используется в качестве аргумента
метода Add и после этого теряется. В итоге вместо одного объекта мы
получаем Dim+1.
Здесь, к сожалению, обойтись без создания вспомогательных об ъ -
ектов не удастся. Поэтому все, что мы можем сделать, — это ввести
вспомогательную переменную для хранения их адресов .
Пример 2.3.11. Улучшенная реализация метода ScalarProduct. Версия 1.
function RVector.ScalarProduct(v: RVector): Rational;
var i: Integer; temp: Rational;
begin
result:=Rational.Create;
for i:=1 to Dim do begin
temp:=self.comp[i].Dot(v.comp[i]) as Rational;
result.Add(temp);
temp.Destroy;
end;
end;
Приведение типа с помощью оператора as необходимо ввиду того, что
метод Dot формально возвращает ссылку на объект класса Number, а
переменная temp имеет тип Rational.
Можно привести и другую версию той же функции, в которой
вспомогательная переменная создается и удаляется всего один раз , но
при этом на каждой интерации цикла дополнительно осуществляется
присваивание методом Assign. На вопрос о том , является ли данный ва-
риант более эф фективным, трудно дать однозначный ответ.
Пример 2.3.12. Улучшенная реализация метода ScalarProduct. Версия 2.
function RVector.ScalarProduct(v: RVector): Rational;
var i: Integer; temp: Rational;
begin
result:=Rational.Create; temp:=Rational.Create;
for i:=1 to Dim do begin
temp.Assign(self.comp[i]); // дополнительное присваивание
temp.MultiplyBy(v.comp[i]);
result.Add(temp);
end;
temp.Destroy;
end;
Зат ем на кажд ой ит ерац ии ц икл а появ л яет с я ещ е од ин — рез ул ьт ат ра-
бот ы м етод а Dot, — ад рес которого ис пол ь з ует с я в качес т в е аргум ент а
м етод а Add и пос л е этого т еряет с я. В итоге в м ес то од ного объект а м ы
пол учаем Dim+1.
Зд ес ь , к с ожал ению, обойт ис ь без с оз д ания в с пом огат ел ь ны х объ-
ектов не уд ас т с я. Поэтом у в с е, что м ы м ожем с д ел ат ь , — это в в ес т и
в с пом огат ел ь ную перем енную д л я хранения их ад рес ов .
Пример2.3.11. Ул учшенная реал из ац ия м етод а ScalarProduct. Верс ия 1.
function RVector.ScalarProduct(v: RVector): Rational;
var i: Integer; temp: Rational;
begin
result:=Rational.Create;
for i:=1 to Dim do begin
temp:=self.comp[i].Dot(v.comp[i]) as Rational;
result.Add(temp);
temp.Destroy;
end;
end;
Прив ед ение т ипа с пом ощ ь ю оператора as необход им о в в ид у того, что
м етод Dot форм ал ь но в оз в ращ ает с с ы л ку на объект кл ас с а Number, а
перем енная temp им еет т ип Rational.
М ожно прив ес т и и д ругую в ерс ию той же функц ии, в которой
в с пом огат ел ь ная перем енная с оз д ает с я и уд ал яет с я в с его од ин раз , но
при этом на кажд ой инт ерац ии ц икл а д опол нит ел ь но ос ущ ес т в л яет с я
прис в аив ание м етод ом Assign. Н а в опрос отом , яв л яет с я л и д анны й в а-
риант бол ее эффект ив ны м , т руд нод ат ь од ноз начны й от в ет.
Пример2.3.12. Ул учшенная реал из ац ия м етод а ScalarProduct. Верс ия 2.
function RVector.ScalarProduct(v: RVector): Rational;
var i: Integer; temp: Rational;
begin
result:=Rational.Create; temp:=Rational.Create;
for i:=1 to Dim do begin
temp.Assign(self.comp[i]); // дополнительное присваивание
temp.MultiplyBy(v.comp[i]);
result.Add(temp);
end;
temp.Destroy;
end;
38
Страницы
- « первая
- ‹ предыдущая
- …
- 36
- 37
- 38
- 39
- 40
- …
- следующая ›
- последняя »
