Передача параметров по значению и ссылке в VFP
« Назад По умолчанию параметры, указанные в опции WITH команды DO, передаются по ссылке, а при вызове программного компонента как функции – по значению. Например: do d:\Output with x, y && Параметры x и y передаются по ссылке Swap(x, y) && Параметры x и y передаются по значению Передача по значению употребляется, когда параметры используются как входные и когда не нужно возвращать в вызывающую процедуру их новые значения. Если же параметры являются выходными (или одновременно и входными и выходными), то они должны быть переданы по ссылке. Команда SET UDFPARMS TO VALUE | REFERENCEзадает способ передачи параметров программному компоненту. Опции: VALUE – параметры-переменные передаются по значению. При передачи параметра по значению фактический параметр остается неизмененным, даже если выполнено изменение соответствующего формального параметра. REFERENCE – параметры-переменные передаются по ссылке. При передачи параметра по ссылке фактический параметр принимает значение формального параметра. Всегда по значению передаются константы и элементы массивов. Независимо от установки SET UDFPARMS параметр, заключенный в скобки, передается по значению, а предваренный символом @ – по ссылке. Программному компоненту будет передан весь массив, если он передается по ссылке. В противном случае будет передан по значению первый элемент массива. Пример 1. Процедура SWAP( ) выполняет обмен значений двух своих параметров. local x, y store 25 to x store –30 to y && Параметры будут передаваться по значению set udfparms to value swap(x, y) && Нет обмена ? x, y && Напечатает: 25 –30 && Параметры будут передаваться по ссылке set udfparms to reference ? x, y && Напечатает: 25 –30 Swap(x, y) && Есть обмен ? x, y && Напечатает: –30 25 procedure Swap(a, b) local hold hold = a a = b b = hold endProc Пример 2. Использование символа @ и круглых скобок при передачи параметров. local x, y store 25 to x store –30 to y set udfparms to value ? x, y && Напечатает: 25 –30 && Оба параметра передаются по ссылке Swap(@x, @y) ? x, y && Напечатает: –30 25 && Первый параметр передается по ссылке, второй – по значению Swap(@x, (y)) ? x, y && Напечатает: 25 25 procedure Swap(a, b) && Текст процедуры Swap( ) см. выше … endProc |