Передача по результату
Одна из проблем при передаче по результату заключается в том, что может возникнуть конфликт на уровне фактических параметров, как в следующем примере: ргос (рагат, рагат);
Процедура ргос, очевидно, имеет два формальных параметра с разными именами. Вероятно, что при ее выполнении эти параметры получат разные значения. Оба значения попадут в фактический параметр рагат.
Возникает вопрос: в каком порядке будет происходить копирование? В данном случае именно порядок определит значение фактического параметра.
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]. Очевидно, что неопределенность должен снять разработчик реализации языка. Вызов процедуры с двумя идентичными параметрами может привести к проблемам и в других методах передачи параметров. |