<<
>>

Передача по результату

Параметр, передаваемый по результату, используется только для передачи результатов вычисления назад, в вызывающую программу. Начальное значение объекта данных, соответствующего фактическому параметру, не имеет никакого значения для подпрограммы и не может быть в ней использовано.
Формальный параметр является локальной переменной (объектом данных), у которого начальное значение отсутствует (или инициализировано обычным способом, предусмотренным для локальных переменных). Когда выполнение подпрограммы завершается, конечное значение формального параметра присваивается фактическому параметру, как в случае передачи по значению-результату.

Одна из проблем при передаче по результату заключается в том, что может возникнуть конфликт на уровне фактических параметров, как в следующем примере: ргос (рагат, рагат);

Процедура ргос, очевидно, имеет два формальных параметра с разными именами. Вероятно, что при ее выполнении эти параметры получат разные значения. Оба значения попадут в фактический параметр рагат.

Возникает вопрос: в каком порядке будет происходить копирование? В данном случае именно порядок определит значение фактического параметра.

340

Глава 13. Подпрограммы

Допустим, что имеется следующий метод, написанный на языке C#: void Report(out int a, out int b) { a = 29; b = 57;

}

В этом языке передача по результату задается спецификатором out при формальном параметре. При вызове obj.Report(out m, out m);

возможны следующие ситуации:

? если первым присваивается значение формального параметра а, то значением фактического параметра вызывающего модуля станет 57;

? если первым присваивается значение b, тогда значение фактического параметра будет равно 29.

Поскольку порядок может задаваться реализацией, различные реализации языка будут генерировать разные результаты.

Другая проблема при передаче по результату состоит в выборе момента для вычисления адреса фактического параметра. Он может определяться в начальной фазе вызова подпрограммы или при возвращении из нее.

Предположим, что существует следующий метод, написанный на языке C#: void Lottery(out int prize, out int position){ prize = 780;

...// Очень много операторов position = 77;

}

Далее вообразим, что где-то в вызывающем модуле записано: index = 21;

obj.Lottery(myArray[index], index);

Адрес ячейки массива myArray[index] в промежутке между началом и завершением вызова метода Lottery изменяется. Если адрес определяется в начальной фазе вызова метода, то значение 780 будет занесено в ячейку myArray[21]. При вычислении адреса в момент возврата из метода число 780 сохраняется в ячейке myArray[77]. Очевидно, что неопределенность должен снять разработчик реализации языка.

Вызов процедуры с двумя идентичными параметрами может привести к проблемам и в других методах передачи параметров.

<< | >>

Еще по теме Передача по результату:

  1. § 29 Передача и переход прав по обязательствам. – Римская конструкция права передачи. – Облегчение передачи новейшим законодательством. – Передаточная надпись. – Ограничения передачи. – Действие передачи. – Ответственность передатчика и права приобретателя. – Вступление в право кредитора или суброгация. – Русский закон передачи. – Передача заемных писем. – Переход требований к кредиторам.
  2. Интервью с официальными лицами или представителями их пресс-служб чреваты двумя проблемами: опасностью невольного искажения информации при передаче, интерпретации фактов, а также передачей намеренно дозированных сведений.
  3. 3. Результаты (outcomes)
  4. 4. Результат исполнения поручения.
  5. Замысел передачи
  6. ПЕРЕДАЧА СВЕТА.
  7. Прямой результат
  8. Подсчет результатов
  9. РЕЗУЛЬТАТЫ
  10. ПЕРЕДАЧА СЦЕНАРИЯ
  11. ПЕРЕДАЧА СЦЕНАРИЯ
  12. Определение результатов голосования
  13. Музыкальные концертно-постановочные передачи
  14. Результат: