| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 909 人关注过本帖
标题:关于用 DO XXX.PRG WITH 数组问题
只看楼主 加入收藏
liunis
Rank: 1
等 级:新手上路
帖 子:153
专家分:7
注 册:2021-9-25
收藏
已结贴  问题点数:10 回复次数:6 
关于用 DO XXX.PRG WITH 数组问题
LOCAL af          && 先声明局部变量
DIMENSION af(4)   && 再定义为数组
af(1) = "E:\SSS.JPG"
af(2) = "E:\SSS.BMP"
af(3) = "E:\SSS.PNG"
af(4) = "E:\AAA.JPG"
DO copy_files.prg WITH af   &&加上 @ 符号会出错。不加只有一个值正确引用。这是一个坑
发现 DO copy_files.prg WITH af(1),af(2),af(3),af(4) 是可以的。
问题是有100个参数时,那不是要写到100?
请教如何传递一个数组?
搜索更多相关主题的帖子: WITH 数组 DO JPG PRG 
2026-08-04 21:11
sych
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:646
专家分:761
注 册:2019-10-11
收藏
得分:10 
DO copy_files.prg WITH @af
改为下面语句
=copy_files(@af)
2026-08-04 21:28
liunis
Rank: 1
等 级:新手上路
帖 子:153
专家分:7
注 册:2021-9-25
收藏
得分:0 
谢谢2楼sych.



LPARAMETERS taParam1, taParam2, taParam3, taParam4, taParam5, ;
            taParam6, taParam7, taParam8, taParam9, taParam10, ;
            taParam11, taParam12, taParam13, taParam14, taParam15, ;
            taParam16, taParam17, taParam18, taParam19, taParam20

LOCAL aFiles, i, nCount, cPath
LOCAL sFiles, bHasChinese, nValidCount
LOCAL sDebugMsg

* 2. 智能判断参数类型并构建内部统一数组 aFiles
IF TYPE("taParam1") = "A"
    nCount = ALEN(taParam1)
    DIMENSION aFiles(nCount)
    FOR i = 1 TO nCount
        aFiles(i) = taParam1(i)
    ENDFOR
ELSE

    * --- 模式 B: 传入的是多个字符串 ---
    nCount = PCOUNT() && 获取实际传入的参数个数

    IF nCount = 0
        MESSAGEBOX("未提供文件路径", 16, "错误")
        RETURN .F.
    ENDIF
   
    DIMENSION aFiles(nCount)
    FOR i = 1 TO nCount
        * 动态获取第 i 个参数的值
        * EVALUATE("taParam" + TRANSFORM(i)) 可以获取 p1, p2... 的值
        cPath = EVALUATE("taParam" + TRANSFORM(i))
        aFiles(i) = cPath
    ENDFOR
ENDIF

* 3. 获取数组长度并初始化调试信息
nTotal = ALEN(aFiles)
sDebugMsg = "处理模式: " + IIF(TYPE("taParam1")="A", "数组模式", "多参数模式") + CHR(13)
sDebugMsg = sDebugMsg + "文件总数: " + TRANSFORM(nTotal) + CHR(13) + CHR(13)

sFiles = ""
bHasChinese = .F.
nValidCount = 0

* 4. 遍历内部数组,构建数据串
FOR i = 1 TO nTotal
    cPath = ALLTRIM(aFiles[i])
   
    * 记录调试信息
    sDebugMsg = sDebugMsg + "索引[" + TRANSFORM(i) + "]: " + cPath + " -> 存在" + TRANSFORM(FILE(cPath)) + CHR(13)
   
    IF !EMPTY(cPath) AND FILE(cPath)
        sFiles = sFiles + cPath + CHR(0)
        nValidCount = nValidCount + 1
        
        * 检测是否包含中文或非ASCII字符
        IF ASC(SUBSTR(cPath, 1, 1)) > 127 OR LEN(cPath) != LEN(STRCONV(cPath, 1))
             bHasChinese = .T.
        ENDIF
    ENDIF
ENDFOR

* 显示调试信息
MESSAGEBOX(sDebugMsg + CHR(13) + "有效文件数: " + TRANSFORM(nValidCount), 64, "调试信息")


*以上是 countfiles.prg 是统计传入的文件数,
*以上有2种传入方法
方法1: DO countfiles WITH  "E:\SSS.JPG", "E:\SSS.BMP", "E:\SSS.PNG", "E:\AAA.JPG" 可以得到正确的解
方法2:

LOCAL af
DIMENSION af(4)
af(1) = "E:\SSS.JPG"
af(2) = "E:\SSS.BMP"
af(3) = "E:\SSS.PNG"
af(4) = "E:\AAA.JPG"
=countfiles(@af)

此时只有一个有效值af(1) ,其它的不见了。  

就可问一下 传入的数组如何 辩识?要区分数组和只传入一个参数时的区别 例如 DO countfiles WITH  "E:\SSS.JPG"
方法2:传入数组识别 并取得值

2026-08-04 22:11
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1241
专家分:1687
注 册:2021-10-13
收藏
得分:0 
IF TYPE("taParam1") = "A"
    nCount = ALEN(taParam1)
    DIMENSION aFiles(nCount)
    FOR i = 1 TO nCount
        aFiles(i) = taParam1(i)
    ENDFOR
ELSE
……
你调试一下这段代码?似乎并不能运行
2026-08-04 23:53
kangss
Rank: 8Rank: 8
等 级:贵宾
威 望:14
帖 子:438
专家分:962
注 册:2014-6-12
收藏
得分:0 
以下是引用liunis在2026-8-4 21:11:57的发言:

LOCAL af          && 先声明局部变量
DIMENSION af(4)   && 再定义为数组
af(1) = "E:\SSS.JPG"
af(2) = "E:\SSS.BMP"
af(3) = "E:\SSS.PNG"
af(4) = "E:\AAA.JPG"
DO copy_files.prg WITH af   &&加上 @ 符号会出错。不加只有一个值正确引用。这是一个坑
发现 DO copy_files.prg WITH af(1),af(2),af(3),af(4) 是可以的。
问题是有100个参数时,那不是要写到100?
请教如何传递一个数组?

既然数组不让传递参数,不如使用1个public来到更直接,方法2:

PUBLIC af(4)
af(1) = "E:\SSS.JPG"
af(2) = "E:\SSS.BMP"
af(3) = "E:\SSS.PNG"
af(4) = "E:\AAA.JPG"

DO copy_files.prg

[此贴子已经被作者于2026-8-5 15:28编辑过]

2026-08-05 15:26
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:11640
专家分:43678
注 册:2014-5-20
收藏
得分:0 
可以传一个字符串,字符串可以转数组。
2026-08-05 16:49
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1241
专家分:1687
注 册:2021-10-13
收藏
得分:0 
用do ... with 传递数组参数不需要@
可以尝试运行下面这段代码,观察数组参数是如何传递的。。。
程序代码:
dime carrayname[1] &&初始化数组
DO myfunction with carrayname &&传递数组参数,不需要@符号
*=myfunction(@carrayname) &&等效方法
?carrayname[1],carrayname[2],carrayname[3] &&显示“test .t. .null.”
function myfunction
parameter carrayname
dime carrayname[3]
carrayname[1]='test'
carrayname[2]=.t.
carrayname[3]=.null.
return .t.
ENDFUNC


楼主的代码是有问题的:
程序代码:
IF TYPE("taParam1") = "A" &&这句永远不成立,因为没有返回“A”的可能
    nCount = ALEN(taParam1)
    DIMENSION aFiles(nCount)
    FOR i = 1 TO nCount
        aFiles(i) = taParam1(i)
    ENDFOR
ELSE
……


判断变量是否为数组的函数是:
?type(“myvar“,1) &&是数组返回“A”,不是返回“U”
刚才vartype是错的。

[此贴子已经被作者于2026-8-5 22:34编辑过]

2026-08-05 21:56
快速回复:关于用 DO XXX.PRG WITH 数组问题
数据加载中...
 
   
关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

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