| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3681 人关注过本帖
标题:不用循环能解决吗
取消只看楼主 加入收藏
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
有更好的办法解决吗?
程序代码:
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编辑过]

2020-09-24 17:53
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
以下是引用吹水佬在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

谢谢!!!
我的思路跟不上
2020-09-24 20:59
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
关于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()的参数就不行了
应如何解决,谢谢!
2020-09-25 18:03
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
以下是引用瓜瓜1990在2020-9-25 19:02:08的发言:

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

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

可否在当这些参数使用后可否释敢这些参数,再调用另外函数中的参数?
2020-09-25 19:54
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
自定义函数:
程序代码:
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编辑过]

2020-09-25 20:39
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
以下是引用吹水佬在2020-9-25 21:11:42的发言:

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

我在16楼就是用类似办法,是因为用循环没有REPL      ALL快,如不行只有这样了。
另外,可否在fun()中的参数用过之后,再用这些参数在fun1()中重新定义解决超26个参数的问题呢?
2020-09-25 21:31
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
以下是引用吹水佬在2020-9-25 21:49:29的发言:

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

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

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

2020-09-26 04:54
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
以下是引用吹水佬在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楼提到的重复初始化问题。
2020-09-26 14:34
快速回复:不用循环能解决吗
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022306 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved