DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
yz(a,b)
? "a,b"
? a(1), a(2),a(3), b(1),b(2), b(3)
yz(@a,b)
? "@a,b"
? a(1), a(2),a(3), b(1),b(2), b(3)
yz(a,@b)
? "a,@b"
? a(1), a(2),a(3), b(1),b(2), b(3)
yz(@a,@b)
? "@a,@b"
? a(1), a(2),a(3), b(1),b(2), b(3)
FUNCTION yz
parameters a(),b()
FOR i=1 TO 3
a(i)="被改"
b(i)="被改"
ENDFOR
ENDFUNC
5 个解决方案
#1
自定义函数yz建的有问题:
1、没有返回值。
2、parameters a,b
3、函数中的a(i)在哪定义的。
1、没有返回值。
2、parameters a,b
3、函数中的a(i)在哪定义的。
#2
楼主在做试验麽?
首先, 型参声明中不能包含括号. 其次, yz 函数这样的写法,只有最后一组调用 yz( @a, @b ) 能够成功.
要明白的是:实参中加上 @ 代表强制按引用传送; 否则, 传送什么取决于命令 SET UDFPARMS TO 的设置值( vfp 缺省行为是:函数按值/过程按引用来传送).
也就是说:
用 yz( @a, @b ) 来调用的话, 实参 a/b 皆做为数组传给 yz
用 yz( @a, b ) 来调用的话, 实参 a 会做为数组来传送, 实参 b 只传该数组的第一个元素. 这是对于函数 yz 来说, 型参 a 接收到的是数组, 而型参 b 接收到的只是一个普通变量(数据类型由调用者的数组 b 第一个元素的数据类型决定).
首先, 型参声明中不能包含括号. 其次, yz 函数这样的写法,只有最后一组调用 yz( @a, @b ) 能够成功.
要明白的是:实参中加上 @ 代表强制按引用传送; 否则, 传送什么取决于命令 SET UDFPARMS TO 的设置值( vfp 缺省行为是:函数按值/过程按引用来传送).
也就是说:
用 yz( @a, @b ) 来调用的话, 实参 a/b 皆做为数组传给 yz
用 yz( @a, b ) 来调用的话, 实参 a 会做为数组来传送, 实参 b 只传该数组的第一个元素. 这是对于函数 yz 来说, 型参 a 接收到的是数组, 而型参 b 接收到的只是一个普通变量(数据类型由调用者的数组 b 第一个元素的数据类型决定).
#3
* 总结一下:
* 一、SET UDFPARMS TO VALUE(默认)时:
ON ERROR ?ERROR(),MESS()
?
?"SET UDFPARMS TO VALUE"
SET UDFPARMS TO VALUE
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"do yz with a,b"
do yz with a,b && do ... with ... 默认传递数组的地址,这样就可以了
? a(1), a(2),a(3), b(1),b(2), b(3)
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"do yz with @a,@b"
do yz with @a,@b && 这样错了,画蛇添足,“语法错误”
? a(1), a(2),a(3), b(1),b(2), b(3)
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"yz(@a,@b)"
yz(@a,@b) && 必须加@指定传递数组的地址
? a(1), a(2),a(3), b(1),b(2), b(3)
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"yz(a,b)"
yz(a,b) && 这样就错了,变成了传递数组的第一个元素
? a(1), a(2),a(3), b(1),b(2), b(3)
* 二、SET UDFPARMS TO REFERENCE时:
?
?"SET UDFPARMS TO REFERENCE"
SET UDFPARMS TO REFERENCE
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"do yz with a,b"
do yz with a,b && do ... with ... 默认传递数组的地址,这样就可以了
? a(1), a(2),a(3), b(1),b(2), b(3)
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"do yz with @a,@b"
do yz with @a,@b && && 这样错了,画蛇添足,“语法错误”
? a(1), a(2),a(3), b(1),b(2), b(3)
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"yz(@a,@b)"
yz(@a,@b) && 都可以
? a(1), a(2),a(3), b(1),b(2), b(3)
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"yz(a,b)"
yz(a,b) && 都可以
? a(1), a(2),a(3), b(1),b(2), b(3)
FUNCTION yz
* parameters a(),b() && vfp没这种写法
parameters a,b
FOR i=1 TO 3
a(i)="被改"
b(i)="被改"
ENDFOR
ENDFUNC
#4
非常感谢三位,让我很明白,但我的积分不够支付给你们,在此想你们表示由衷的歉意,谢谢!
#5
VFP 形参声明中不能包含括号
#1
自定义函数yz建的有问题:
1、没有返回值。
2、parameters a,b
3、函数中的a(i)在哪定义的。
1、没有返回值。
2、parameters a,b
3、函数中的a(i)在哪定义的。
#2
楼主在做试验麽?
首先, 型参声明中不能包含括号. 其次, yz 函数这样的写法,只有最后一组调用 yz( @a, @b ) 能够成功.
要明白的是:实参中加上 @ 代表强制按引用传送; 否则, 传送什么取决于命令 SET UDFPARMS TO 的设置值( vfp 缺省行为是:函数按值/过程按引用来传送).
也就是说:
用 yz( @a, @b ) 来调用的话, 实参 a/b 皆做为数组传给 yz
用 yz( @a, b ) 来调用的话, 实参 a 会做为数组来传送, 实参 b 只传该数组的第一个元素. 这是对于函数 yz 来说, 型参 a 接收到的是数组, 而型参 b 接收到的只是一个普通变量(数据类型由调用者的数组 b 第一个元素的数据类型决定).
首先, 型参声明中不能包含括号. 其次, yz 函数这样的写法,只有最后一组调用 yz( @a, @b ) 能够成功.
要明白的是:实参中加上 @ 代表强制按引用传送; 否则, 传送什么取决于命令 SET UDFPARMS TO 的设置值( vfp 缺省行为是:函数按值/过程按引用来传送).
也就是说:
用 yz( @a, @b ) 来调用的话, 实参 a/b 皆做为数组传给 yz
用 yz( @a, b ) 来调用的话, 实参 a 会做为数组来传送, 实参 b 只传该数组的第一个元素. 这是对于函数 yz 来说, 型参 a 接收到的是数组, 而型参 b 接收到的只是一个普通变量(数据类型由调用者的数组 b 第一个元素的数据类型决定).
#3
* 总结一下:
* 一、SET UDFPARMS TO VALUE(默认)时:
ON ERROR ?ERROR(),MESS()
?
?"SET UDFPARMS TO VALUE"
SET UDFPARMS TO VALUE
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"do yz with a,b"
do yz with a,b && do ... with ... 默认传递数组的地址,这样就可以了
? a(1), a(2),a(3), b(1),b(2), b(3)
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"do yz with @a,@b"
do yz with @a,@b && 这样错了,画蛇添足,“语法错误”
? a(1), a(2),a(3), b(1),b(2), b(3)
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"yz(@a,@b)"
yz(@a,@b) && 必须加@指定传递数组的地址
? a(1), a(2),a(3), b(1),b(2), b(3)
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"yz(a,b)"
yz(a,b) && 这样就错了,变成了传递数组的第一个元素
? a(1), a(2),a(3), b(1),b(2), b(3)
* 二、SET UDFPARMS TO REFERENCE时:
?
?"SET UDFPARMS TO REFERENCE"
SET UDFPARMS TO REFERENCE
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"do yz with a,b"
do yz with a,b && do ... with ... 默认传递数组的地址,这样就可以了
? a(1), a(2),a(3), b(1),b(2), b(3)
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"do yz with @a,@b"
do yz with @a,@b && && 这样错了,画蛇添足,“语法错误”
? a(1), a(2),a(3), b(1),b(2), b(3)
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"yz(@a,@b)"
yz(@a,@b) && 都可以
? a(1), a(2),a(3), b(1),b(2), b(3)
DIME a(3),b(3)
FOR i=1 TO 3
a(i)="原数"
b(i)="原数"
ENDFOR
?
?"yz(a,b)"
yz(a,b) && 都可以
? a(1), a(2),a(3), b(1),b(2), b(3)
FUNCTION yz
* parameters a(),b() && vfp没这种写法
parameters a,b
FOR i=1 TO 3
a(i)="被改"
b(i)="被改"
ENDFOR
ENDFUNC
#4
非常感谢三位,让我很明白,但我的积分不够支付给你们,在此想你们表示由衷的歉意,谢谢!
#5
VFP 形参声明中不能包含括号