自定义函数的形参是数组,怎么定义这个形参

时间:2022-07-20 19:48:45
自定义函数的形参是数组,该怎么定义这个形参,如下面的程序,总是报错“找不到parameters语句”
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)在哪定义的。

#2


楼主在做试验麽?

首先, 型参声明中不能包含括号. 其次, 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)在哪定义的。

#2


楼主在做试验麽?

首先, 型参声明中不能包含括号. 其次, 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 形参声明中不能包含括号