注册 登录
编程论坛 VFP论坛

不用循环能解决吗

fdqzy 发布于 2020-09-22 19:31, 4642 次点击
程序代码:
create cursor b1 (m c(3),m1 n(3), m2 n(3))
insert into b1 values ("10",59,0)
insert into b1 values ("",10,0)
insert into b1 values ("011",82,0)
insert into b1 values ("01",75,0)
insert into b1 values ("",56,0)
SCAN
  p1=LEN(ALLTRIM(m))
  REPLACE m2 WITH IIF(p1>0,m1,0)
ENDSCAN
brow

由于数据量大,此问题能否不用循环以提高效率。
谢谢!
31 回复
#2
吹水佬2020-09-22 20:02
REPLACE ALL m2 WITH IIF(!EMPTY(m),m1,0)
#3
fdqzy2020-09-22 20:53
谢谢!
下面给一个动态的替换

[此贴子已经被作者于2020-9-22 20:58编辑过]

#4
fdqzy2020-09-22 21:05
请教:
下面是动态返回相应字段的值,能否也用 REPLACE ALL进行或其他效率高的代码
程序代码:
create cursor b1 (m c(3),m1 n(3), m2 n(3),m3 n(3))
insert into b1 values ("10",59,40,0)
insert into b1 values ("",10,50,0)
insert into b1 values ("01",82,48,0)
insert into b1 values ("1",75,35,0)
insert into b1 values ("0",56,46,0)

scan
p1=ALLTRIM('m')+ALLTRIM(STR(LEN(ALLTRIM(m))))
REPLACE  m3 WITH IIF(LEN(ALLTRIM(m))>0,&p1,0)
endscan
BROWSE

根据m的长度返回以"m+m的长度"对应字段的值,如m=10,长度为2,m3返回m2的值,m=0,长度为1,m3返回m1的值
谢谢

[此贴子已经被作者于2020-9-22 21:19编辑过]

#5
吹水佬2020-09-22 21:22
REPLACE ALL m3 WITH IIF(!EMPTY(m), EVALUATE("m"+TRANSFORM(LEN(ALLTRIM(m)))), 0)
#6
fdqzy2020-09-22 21:48
以下是引用吹水佬在2020-9-22 21:22:48的发言:

REPLACE ALL m3 WITH IIF(!EMPTY(m), EVALUATE("m"+TRANSFORM(LEN(ALLTRIM(m)))), 0)

多谢,效率高多了!
我对函数的理解太差了,多多学习。
#7
fdqzy2020-09-23 13:53
以下是引用吹水佬在2020-9-22 21:22:48的发言:

REPLACE ALL m3 WITH IIF(!EMPTY(m), EVALUATE("m"+TRANSFORM(LEN(ALLTRIM(m)))), 0)

我曾用以下:
p1="m"+TRANSFORM(LEN(ALLTRIM(m)))
REPLACE ALL  m3 WITH IIF(!EMPTY(m),&p1,0)
但却用m1替换m3,不知何原因?
#8
吹水佬2020-09-23 15:18
以下是引用fdqzy在2020-9-23 13:53:17的发言:


我曾用以下:
p1="m"+TRANSFORM(LEN(ALLTRIM(m)))
REPLACE ALL  m3 WITH IIF(!EMPTY(m),&p1,0)
但却用m1替换m3,不知何原因?

先看看p1是什么就清楚
估计就是
p1="m1"
REPLACE ALL  m3 WITH IIF(!EMPTY(m),&p1,0)
相当于
REPLACE ALL  m3 WITH IIF(!EMPTY(m),m1,0)
#9
fdqzy2020-09-23 16:07
以下是引用吹水佬在2020-9-23 15:18:29的发言:


先看看p1是什么就清楚
估计就是
p1="m1"
REPLACE ALL  m3 WITH IIF(!EMPTY(m),&p1,0)
相当于
REPLACE ALL  m3 WITH IIF(!EMPTY(m),m1,0)

哦,而EVALUATE("m"+TRANSFORM(LEN(ALLTRIM(m))))是动态的。
#10
fdqzy2020-09-23 16:48
老师:
再请教关于自定义的问题.
我要用:
      kk1=OCCURS("M", m1 + m2 + m3 + m4 + m5)
      kk2=OCCURS("P", P1 + P2 + P3 )
      kk3=OCCURS("_", _1D + _2D + _3D + _4D )
      .....
      的kk1,kk2,kk3...统计数个数,能否一次性把他们用自定义过程,以便在后面的代码中逐一调用这些参数?
怎样做(我不懂),谢谢!
     

[此贴子已经被作者于2020-9-23 16:49编辑过]

#11
吹水佬2020-09-23 17:54
回复 10楼 fdqzy
要着具体是怎样使用这些变量
类似问题之前的贴有讨论过重复使用变量kk
#12
fdqzy2020-09-23 18:49
只有本站会员才能查看附件,请 登录

分别统计_1D,_2D,_3D在同一记录上的总个数,_1X,_2X,_3x在同一记录上的总个数
程序代码:
CLOSE TABLES all
USE fc\b4
REPLACE ALL ;
            md1 WITH IIF(OCCURS("_", _1D + _2D + _3D)=1,"MD1", "");
            md2 WITH IIF(OCCURS("_", _1D + _2D + _3D)=2,"MD2", "");
            md3 WITH IIF(OCCURS("_", _1D + _2D + _3D)=3,"MD3", "");
           
REPLACE ALL ;
            mx1 WITH IIF(OCCURS("_", _1X + _2X + _3X)=1,"MX1", "");
            mx2 WITH IIF(OCCURS("_", _1X + _2X + _3X)=2,"MX2", "");
            mx3 WITH IIF(OCCURS("_", _1X + _2X + _3X)=3,"MX3", "")

表中类似统计很多,这样写有点麻烦。
用你前面的方法:
kk=0
REPLACE ALL ;
    p1 WITH IIF(fun()=1, 'P1', ''),;
    p2 WITH IIF(kk=2, 'P2', ''),;
    p3 WITH IIF(kk>2, 'P3', '')

RETURN

FUNCTION fun()
    kk = OCCURS("M",m1+m2+m3+m4+m5)
    RETURN kk
ENDFUNC
自定义函数只一次统计1个类型,能否用自定义多个参数如kk1,kk2...传递到后面要用的统计代码中。
#13
fdqzy2020-09-23 20:06
程序代码:
CLOSE TABLES all
USE b4
BLANK FIELDS md1,md2,md3,mx1,mx2,mx3 ALL
kk1=0
kk2=0
REPLACE ALL ;
            md1 WITH IIF(fun()=1,"MD1", "");
            md2 WITH IIF(kk1=2,"MD2", "");
            md3 WITH IIF(kk1=3,"MD3", "")
           
REPLACE ALL ;
            mx1 WITH IIF(fun1()=1,"MX1", "");
            mx2 WITH IIF(kk2=2,"MX2", "");
            mx3 WITH IIF(kk2=3,"MX3", "")
  RETURN


FUNCTION fun()

kk1=OCCURS("_", _1D + _2D + _3D)

RETURN kk1
ENDFUNC

FUNCTION fun1()

kk2=OCCURS("_", _1X + _2X + _3X)
RETURN kk2
ENDFUNC

这样行吗?
把上面代码都放在1个prg文件中,不太习惯。
能否只把过程文件放在prg文件中?
#14
吹水佬2020-09-23 21:05
回复 13楼 fdqzy
将主过程和自定义函数放在一个PRG只是方便阅读和运行示例,实际情况极少会这样做。
可以将所有相关的自定义函数放在一个PRG,用到时用 SET PROCEDURE TO 载入。
如果在当前表单里运行,可在设计表单时自定义表单方法fun,调用时用 thisform.fun()。
假设自定义函数放在funs.prg
程序代码:

FUNCTION fun()
    kk1 = OCCURS("_", _1D + _2D + _3D)
    kk2 = OCCURS("_", _1X + _2X + _3X)
    RETURN kk1
ENDFUNC

FUNCTION fun1()
   ******
ENDFUNC

FUNCTION fun2()
   ******
ENDFUNC


主过程代码
程序代码:
SET PROCEDURE TO funs.prg ADDITIVE
PRIVATE kk1,kk2
kk1 = 0
kk2 = 0
USE b4
REPLACE ALL ;
    md1 WITH IIF(fun()==1, "MD1", ""),;
    md2 WITH IIF(kk1==2, "MD2", ""),;
    md3 WITH IIF(kk1==3, "MD3", ""),;
    mx1 WITH IIF(kk2==1, "MX1", ""),;
    mx2 WITH IIF(kk2==2, "MX2", ""),;
    mx3 WITH IIF(kk2==3, "MX3", "")
RELEASE PROCEDURE funs.prg
SELECT * FROM b4

#15
fdqzy2020-09-23 21:26
以下是引用吹水佬在2020-9-23 21:05:39的发言:

将主过程和自定义函数放在一个PRG只是方便阅读和运行示例,实际情况极少会这样做。
可以将所有相关的自定义函数放在一个PRG,用到时用 SET PROCEDURE TO 载入。
如果在当前表单里运行,可在设计表单时自定义表单方法fun,调用时用 thisform.fun()。
假设自定义函数放在funs.prg

FUNCTION fun()
    kk1 = OCCURS("_", _1D + _2D + _3D)
    kk2 = OCCURS("_", _1X + _2X + _3X)
    RETURN kk1
ENDFUNC

FUNCTION fun1()
   ******
ENDFUNC

FUNCTION fun2()
   ******
ENDFUNC


主过程代码
SET PROCEDURE TO funs.prg ADDITIVE
PRIVATE kk1,kk2
kk1 = 0
kk2 = 0
USE b4
REPLACE ALL ;
    md1 WITH IIF(fun()==1, "MD1", ""),;
    md2 WITH IIF(kk1==2, "MD2", ""),;
    md3 WITH IIF(kk1==3, "MD3", ""),;
    mx1 WITH IIF(kk2==1, "MX1", ""),;
    mx2 WITH IIF(kk2==2, "MX2", ""),;
    mx3 WITH IIF(kk2==3, "MX3", "")
RELEASE PROCEDURE funs.prg
SELECT * FROM b4

谢谢!又涨了点知识。
#16
fdqzy2020-09-24 17:53
有更好的办法解决吗?
程序代码:
USE b1 IN 0 ALIAS t1

USE b1 IN 0 ALIAS t2 AGAIN
SELECT t1
SET RELATION TO RECNO()+1 INTO "t2"

SCAN
  tj=0
  if '_'$t1._1d and '_'$t2._1d &&两表上下相同
     tj=tj+1
  endif
  if '_'$t1._2d and '_'$t2._2d
     tj=tj+1
  ENDIF
  if '_'$t1._3d and '_'$t2._3d
     tj=tj+1
  ENDIF
  
  REPLACE t2.mdx1 WITH IIF(tj=1, 'MDX1', '');
          t2.mdx2 WITH IIF(tj=2, 'MDX2', '');
          t2.mdx3 WITH IIF(tj=3, 'MDX3', '')
ENDSCAN


[此贴子已经被作者于2020-9-24 17:59编辑过]

#17
吹水佬2020-09-24 20:40
回复 16楼 fdqzy
与之前的贴大同小异,变通一下就OK
程序代码:

USE b1 IN 0 ALIAS t1
USE b1 IN 0 ALIAS t2 AGAIN
SELECT t1
SET RELATION TO RECNO()+1 INTO "t2"
PRIVATE tj
tj = 0
REPLACE ALL ;
    t2.mdx1 WITH IIF(fun()=1, 'MDX1', ''),;
    t2.mdx2 WITH IIF(tj=2, 'MDX2', ''),;
    t2.mdx3 WITH IIF(tj=3, 'MDX3', '')
SELECT * FROM b1
RETURN

FUNCTION fun()
    tj =      IIF('_'$t1._1d and '_'$t2._1d, 1, 0)
    tj = tj + IIF('_'$t1._2d and '_'$t2._2d, 1, 0)
    tj = tj + IIF('_'$t1._3d and '_'$t2._3d, 1, 0)
    RETURN tj
ENDFUNC

#18
fdqzy2020-09-24 20:59
以下是引用吹水佬在2020-9-24 20:40:44的发言:

与之前的贴大同小异,变通一下就OK

USE b1 IN 0 ALIAS t1
USE b1 IN 0 ALIAS t2 AGAIN
SELECT t1
SET RELATION TO RECNO()+1 INTO "t2"
PRIVATE tj
tj = 0
REPLACE ALL ;
    t2.mdx1 WITH IIF(fun()=1, 'MDX1', ''),;
    t2.mdx2 WITH IIF(tj=2, 'MDX2', ''),;
    t2.mdx3 WITH IIF(tj=3, 'MDX3', '')
SELECT * FROM b1
RETURN

FUNCTION fun()
    tj =      IIF('_'$t1._1d and '_'$t2._1d, 1, 0)
    tj = tj + IIF('_'$t1._2d and '_'$t2._2d, 1, 0)
    tj = tj + IIF('_'$t1._3d and '_'$t2._3d, 1, 0)
    RETURN tj
ENDFUNC

谢谢!!!
我的思路跟不上
#19
fdqzy2020-09-25 18:03
关于FUNCTION参数传递超26个的问题:
程序代码:
FUNCTION fun1()
    kk1......
    kk2......
......
    kk20.....

 
    RETURN kk1
ENDFUNC

FUNCTION fun2()
    bb1......
    bb2......
......
    bb15..
ENDFUNC

在主程序中,除fun1()中能正确传递参数外
fun2()的参数不能正确传递。
我又把fun1()和fun2()分别放入2个prg文件中,在主程序中
SET PROCEDURE TO funs1.prg ADDITIVE
......

SET PROCEDURE TO funs2.prg ADDITIVE
.....

还是与只正确传递fun1()中的20个参数值,fun2()的参数就不行了
应如何解决,谢谢!
#20
瓜瓜19902020-09-25 19:02
回复 19楼 fdqzy
VFP中函数最多只允许26个参数
另外把函数放在一个过程文件里,set procedure to 使用一次就可以了.

[此贴子已经被作者于2020-9-25 19:05编辑过]

#21
吹水佬2020-09-25 19:46
回复 19楼 fdqzy
看不明
要看具体情况,最好有个示例代码
#22
fdqzy2020-09-25 19:54
以下是引用瓜瓜1990在2020-9-25 19:02:08的发言:

VFP中函数最多只允许26个参数
另外把函数放在一个过程文件里,set procedure to 使用一次就可以了.

是一个函数允许不超过26个参数,还是在一个程序中所有函数参数的总量?

可否在当这些参数使用后可否释敢这些参数,再调用另外函数中的参数?
#23
吹水佬2020-09-25 19:57
以下是引用fdqzy在2020-9-25 18:03:50的发言:

关于FUNCTION参数传递超26个的问题:
FUNCTION fun1()
    kk1......
    kk2......
......
    kk20.....
 
    RETURN kk1
ENDFUNC

看似是变量,不是函数的参数
#24
fdqzy2020-09-25 20:39
自定义函数:
程序代码:
FUNCTION fun()
    kdx = OCCURS("_", _1D + _2D + _3D)
    kjo1t = OCCURS("_", _1SYJO1T + _2SYJO1T + _3SYJO1T)
    kjotf = OCCURS("_", _1SYJOTF + _2SYJOTF + _3SYJOTF)
    ksst = OCCURS("_", _1SST + _2SST + _3SST)
    kx5 = OCCURS("_", _1X5 + _2X5 + _3X5)
    ksj = OCCURS("_", _1SJ + _2SJ + _3SJ)
    ksyt = OCCURS("_", _1SYT + _2SYT + _3SYT)
    ksd = OCCURS("_", _1SD + _2SD + _3SD)
    ksq = OCCURS("_", _1SQ + _2SQ + _3SQ)
    ksty = OCCURS("_", _1STY + _2STY + _3STY)
    kstw = OCCURS("_", _1STW + _2STW + _3STW)
    ksz = OCCURS("_", _1SZ + _2SZ + _3SZ)
    ksyf = OCCURS("_", _1SYF + _2SYF + _3SYF)
    ksys = OCCURS("_", _1SYS + _2SYS + _3SYS)
    kp0 = OCCURS("_", _1P0 + _2P0 + _3P0)
    kp1_5 = OCCURS("_", _1P1_5 + _2P1_5 + _3P1_5)
    kp6 = OCCURS("_", _1P6 + _2P6 + _3P6)
    RETURN kdx
ENDFUNC

FUNCTION fun1()
    kdxtj =      IIF('_'$t1._1d and '_'$t2._1d, 1, 0)
    kdxtj = kdxtj + IIF('_'$t1._2d and '_'$t2._2d, 1, 0)
    kdxtj = kdxtj + IIF('_'$t1._3d and '_'$t2._3d, 1, 0)
   
    kjo1ttj =      IIF('_'$t1._1syjo1t and '_'$t2._1syjo1t, 1, 0)
    kjo1ttj = kjo1ttj + IIF('_'$t1._2syjo1t and '_'$t2._2syjo1t, 1, 0)
    kjo1ttj = kjo1ttj + IIF('_'$t1._3syjo1t and '_'$t2._3syjo1t, 1, 0)
   
    kjotftj =      IIF('_'$t1._1syjotf and '_'$t2._1syjotf, 1, 0)
    kjotftj = kjotftj + IIF('_'$t1._2syjotf and '_'$t2._2syjotf, 1, 0)
    kjotftj = kjotftj + IIF('_'$t1._3syjotf and '_'$t2._3syjotf, 1, 0)
   
    kssttj =      IIF('_'$t1._1sst and '_'$t2._1sst, 1, 0)
    kssttj = kssttj + IIF('_'$t1._2sst and '_'$t2._2sst, 1, 0)
    kssttj = kssttj + IIF('_'$t1._3sst and '_'$t2._3sst, 1, 0)
   
    kdxtj =      IIF('_'$t1._1syt and '_'$t2._1syt, 1, 0)
    kdxtj = kdxtj + IIF('_'$t1._2syt and '_'$t2._2syt, 1, 0)
    kdxtj = kdxtj + IIF('_'$t1._3syt and '_'$t2._3syt, 1, 0)
   
    kx5tj =      IIF('_'$t1._1x5 and '_'$t2._1x5, 1, 0)
    kx5tj = kx5tj + IIF('_'$t1._2x5 and '_'$t2._2x5, 1, 0)
    kx5tj = kx5tj + IIF('_'$t1._3x5 and '_'$t2._3x5, 1, 0)
   
    ksjtj =      IIF('_'$t1._1sj and '_'$t2._1sj, 1, 0)
    ksjtj = ksjtj + IIF('_'$t1._2sj and '_'$t2._2sj, 1, 0)
    ksjtj = ksjtj + IIF('_'$t1._3sj and '_'$t2._3sj, 1, 0)
   
    ksyttj =      IIF('_'$t1._1syt and '_'$t2._1syt, 1, 0)
    ksyttj = ksyttj + IIF('_'$t1._2syt and '_'$t2._2syt, 1, 0)
    ksyttj = ksyttj + IIF('_'$t1._3syt and '_'$t2._3syt, 1, 0)
   
    ksdtj =      IIF('_'$t1._1sd and '_'$t2._1sd, 1, 0)
    ksdtj = ksdtj + IIF('_'$t1._2sd and '_'$t2._2sd, 1, 0)
    ksdtj = ksdtj + IIF('_'$t1._3sd and '_'$t2._3sd, 1, 0)
   
    ksqtj =      IIF('_'$t1._1sq and '_'$t2._1sq, 1, 0)
    ksqtj = ksqtj + IIF('_'$t1._2sq and '_'$t2._2sq, 1, 0)
    ksqtj = ksqtj + IIF('_'$t1._3sq and '_'$t2._3sq, 1, 0)
   
    kstytj =      IIF('_'$t1._1sty and '_'$t2._1sty, 1, 0)
    kstytj = kstytj + IIF('_'$t1._2sty and '_'$t2._2sty, 1, 0)
    kstytj = kstytj + IIF('_'$t1._3sty and '_'$t2._3sty, 1, 0)
   
    kstwtj =      IIF('_'$t1._1stw and '_'$t2._1stw, 1, 0)
    kstwtj = kstwtj + IIF('_'$t1._2stw and '_'$t2._2stw, 1, 0)
    kstwtj = kstwtj + IIF('_'$t1._3stw and '_'$t2._3stw, 1, 0)
   
    ksztj =      IIF('_'$t1._1sz and '_'$t2._1sz, 1, 0)
    ksztj = ksztj + IIF('_'$t1._2sz and '_'$t2._2sz, 1, 0)
    ksztj = ksztj + IIF('_'$t1._3sz and '_'$t2._3sz, 1, 0)
   
    ksyftj =      IIF('_'$t1._1syf and '_'$t2._1syf, 1, 0)
    ksyftj = ksyftj + IIF('_'$t1._2syf and '_'$t2._2syf, 1, 0)
    ksyftj = ksyftj + IIF('_'$t1._3syf and '_'$t2._3syf, 1, 0)
   
    ksystj =      IIF('_'$t1._1sys and '_'$t2._1sys, 1, 0)
    ksystj = ksystj + IIF('_'$t1._2sys and '_'$t2._2sys, 1, 0)
    ksystj = ksystj + IIF('_'$t1._3sys and '_'$t2._3sys, 1, 0)
   
    kp0tj =      IIF('_'$t1._1p0 and '_'$t2._1p0, 1, 0)
    kp0tj = kp0tj + IIF('_'$t1._2p0 and '_'$t2._2p0, 1, 0)
    kp0tj = kp0tj + IIF('_'$t1._3p0 and '_'$t2._3p0, 1, 0)
   
    kp1_5tj =      IIF('_'$t1._1p1_5 and '_'$t2._1p1_5, 1, 0)
    kp1_5tj = kp1_5tj + IIF('_'$t1._2p1_5 and '_'$t2._2p1_5, 1, 0)
    kp1_5tj = kp1_5tj + IIF('_'$t1._3p1_5 and '_'$t2._3p1_5, 1, 0)
   
    kp6tj =      IIF('_'$t1._1p6 and '_'$t2._1p6, 1, 0)
    kp6tj = kp6tj + IIF('_'$t1._2p6 and '_'$t2._2p6, 1, 0)
    kp6tj = kp6tj + IIF('_'$t1._3p6 and '_'$t2._3p6, 1, 0)
   
    RETURN kdxtj
   
ENDFUNC  


主程序
程序代码:
SET PROCEDURE TO progs\funs.prg  ADDITIVE
PRIVATE kdx,kjo1t,kjotf,ksst,kx5,ksj,ksyt,ksq,ksty,kstw,ksz,ksyf,ksys,kp0,kp1_5,kp6;
        kdxtj,kjo1ttj,kjotftj,kssttj,kx5tj,ksjtj,ksyttj,ksqtj,kstytj,kstwtj,ksztj,ksyftj,ksystj,kp0tj,kp1_5tj,kp6tj
kdx=0
kjo1t=0
kjotf=0
ksst=0
kx5=0
ksj=0
ksyt=0
ksq=0
ksty=0
kstw=0
ksz=0
ksyf=0
ksys=0
kp0=0
kp1_5=0
kp6=0  
kdxtj=0 &&以下是fun1()中的参数
kjo1ttj=0
kjotftj=0
kssttj=0
kx5tj=0
ksjtj=0
ksyttj=0
ksqtj=0
kstytj=0
kstwtj=0
ksztj=0
ksyftj=0
ksystj=0
kp0tj=0
kp1_5tj=0
kp6tj=0  

超过26个。
到fun1()中的第1个“kdxtj“就不能正常使用了(传递错误值)


[此贴子已经被作者于2020-9-25 20:44编辑过]

#25
吹水佬2020-09-25 21:00
几十个变量不算多吧
fun1()中的“kdxtj“好像有冲突,出现了两次初始化,第一次无效的
    kdxtj =      IIF('_'$t1._1d and '_'$t2._1d, 1, 0)
    kdxtj = kdxtj + IIF('_'$t1._2d and '_'$t2._2d, 1, 0)
    kdxtj = kdxtj + IIF('_'$t1._3d and '_'$t2._3d, 1, 0)
   
............
   
    kdxtj =      IIF('_'$t1._1syt and '_'$t2._1syt, 1, 0)
    kdxtj = kdxtj + IIF('_'$t1._2syt and '_'$t2._2syt, 1, 0)
    kdxtj = kdxtj + IIF('_'$t1._3syt and '_'$t2._3syt, 1, 0)
#26
吹水佬2020-09-25 21:11
回复 24楼 fdqzy
算法有点复杂,效率并不一定会提高
在 SCAN ... ENDSCAN 中使用几个间接变量来逐条记录处理,效率也差不了多少。

#27
fdqzy2020-09-25 21:31
以下是引用吹水佬在2020-9-25 21:11:42的发言:

算法有点复杂,效率并不一定会提高
在 SCAN ... ENDSCAN 中使用几个间接变量来逐条记录处理,效率也差不了多少。

我在16楼就是用类似办法,是因为用循环没有REPL      ALL快,如不行只有这样了。
另外,可否在fun()中的参数用过之后,再用这些参数在fun1()中重新定义解决超26个参数的问题呢?
#28
吹水佬2020-09-25 21:49
回复 27楼 fdqzy
传递参数的最大数目 26
默认的内存变量数目 16384
内存变量的最大数目 65000
你的问题不是“传递参数”,而是“内存变量数”,最多可用到65000个
#29
fdqzy2020-09-26 04:54
以下是引用吹水佬在2020-9-25 21:49:29的发言:

传递参数的最大数目 26
默认的内存变量数目 16384
内存变量的最大数目 65000
你的问题不是“传递参数”,而是“内存变量数”,最多可用到65000个

但是我在前面一个自定义丞数中用25个变量,调用后正常,把第24的个变量放在第二个自定义函数中,再增加几个(总变量超26个),这第24的变量就不能正确传递了。如果是变量,就不是在自定义函数中用参数的办法传递了。把前面自定义函数的变量和賦值放在子程序中调用,行吗?

[此贴子已经被作者于2020-9-26 05:43编辑过]

#30
bccn2012032020-09-26 06:26
用数组做变量
#31
吹水佬2020-09-26 09:31
回复 29楼 fdqzy
应该不是变量数目的问题
检查一下变量使用有无冲突,如25楼提到的变量kdxtj就有冲突。
随便定义60个变量测试:
程序代码:
PRIVATE m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,;
    m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,;
    m21,m22,m23,m24,m25,m26,m27,m28,m29,m30,;
    m31,m32,m33,m34,m35,m36,m37,m38,m39,m40,;
    m41,m42,m43,m44,m45,m46,m47,m48,m49,m50,;
    m51,m52,m53,m54,m55,m56,m57,m58,m59,m60
FOR i=1 TO 60
    _vfp.SetVar("m"+TRANSFORM(i),0)
ENDFOR
fun()
fun1()
printvar(1,30)
printvar(31,60)
RETURN

FUNCTION fun()
    FOR i=1 TO 30
        EXECSCRIPT("m"+TRANSFORM(i)+"="+TRANSFORM(i))
    ENDFOR
ENDFUNC

FUNCTION fun1()
    FOR i=31 TO 60
        EXECSCRIPT("m"+TRANSFORM(i)+"="+TRANSFORM(i))
    ENDFOR
ENDFUNC  

FUNCTION printvar(n,m)
    FOR i=n TO m
        ? "m"+TRANSFORM(i), EVALUATE("m"+TRANSFORM(i))
    ENDFOR
    WAIT
ENDFUNC
#32
fdqzy2020-09-26 14:34
以下是引用吹水佬在2020-9-26 09:31:31的发言:

应该不是变量数目的问题
检查一下变量使用有无冲突,如25楼提到的变量kdxtj就有冲突。
随便定义60个变量测试:
PRIVATE m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,;
    m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,;
    m21,m22,m23,m24,m25,m26,m27,m28,m29,m30,;
    m31,m32,m33,m34,m35,m36,m37,m38,m39,m40,;
    m41,m42,m43,m44,m45,m46,m47,m48,m49,m50,;
    m51,m52,m53,m54,m55,m56,m57,m58,m59,m60
FOR i=1 TO 60
    _vfp.SetVar("m"+TRANSFORM(i),0)
ENDFOR
fun()
fun1()
printvar(1,30)
printvar(31,60)
RETURN

FUNCTION fun()
    FOR i=1 TO 30
        EXECSCRIPT("m"+TRANSFORM(i)+"="+TRANSFORM(i))
    ENDFOR
ENDFUNC

FUNCTION fun1()
    FOR i=31 TO 60
        EXECSCRIPT("m"+TRANSFORM(i)+"="+TRANSFORM(i))
    ENDFOR
ENDFUNC  

FUNCTION printvar(n,m)
    FOR i=n TO m
        ? "m"+TRANSFORM(i), EVALUATE("m"+TRANSFORM(i))
    ENDFOR
    WAIT
ENDFUNC

谢谢!是我粗心大意,就是25楼提到的重复初始化问题。
1