VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 302|回复: 7

[讨论] 无效的过程调用或参数:Debug.Print Join(B) 怎么修正?

[复制链接]
发表于 2019-10-15 10:20:22 | 显示全部楼层 |阅读模式
  1. Private Declare Function VarPtr Lib "MSVBVM60" (var As Any) As Long
  2. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)

  3. Private Sub Command1_Click()
  4.     Dim N%, I%, J%, A() As Double, B() As Double
  5.     N = 3
  6.    
  7.     ReDim A(1 To N, 1 To N)
  8.     ReDim B(1 To N ^ 2)
  9.     For I = 1 To N
  10.         For J = 1 To N
  11.             A(I, J) = J + (I - 1) * N
  12.         Next
  13.     Next
  14.    
  15.     CopyMemory ByVal VarPtr(B(1)), ByVal VarPtr(A(1, 1)), (N ^ 2) * 16
  16.    
  17.     Debug.Print Join(B)
  18.     Stop
  19.    
  20. End Sub
复制代码

       以上过程是为了复制二维数组A中指定的行,到一维数组B。
那么问题来了:
    当A,B两个数组都是Double类型时,则运行出错:Debug.Print Join(B) 即无效的过程调用或参数;
    而把A,B两个数组都改成Variant 类型时,则没有错;而Variant 类型在我源程序中用起来不方便,原因是程序有很多个数值类型的数组,需要用VAL或是INT等函数来重新转换成数值来进行加减运算,不转换为数值的情况下有的为空则程序出错;所以不得不转换类型,但这样一来,导致程序的运行效率降低太多。

请教:
      1) 如何使A,B两个数组都是Double类型,且Debug.Print Join(B)  不出错?
      2)假如第一问解决了,那么:如果不用Debug.Print Join(B) ,而是采用循环读取数组A中的指定行数据到B,这是可行的,但运行效率和 Debug.Print Join(B)  比较起来,谁会更快?

敬谢~
发表于 2019-10-19 08:45:43 | 显示全部楼层
我帮你在网上搜了一下,结论是用CopyMemory来复制数组问题多多,还不如用循环。@977348471

关于用CopyMemory的API内存复制数组有这两个帖子参考一下
http://www.vbforums.com/showthre ... ne-Array-to-another

还有个讨论字符串数组的。
http://demon.tw/programming/vb6-repick-efficient-array.html


评分

参与人数 1威望 +10 人气 +2 收起 理由
bruly + 10 + 2 很给力

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2019-10-17 13:36:38 | 显示全部楼层
VarPtr没必要声明吧,VB本身就可以调用

评分

参与人数 1威望 +8 人气 +2 收起 理由
bruly + 8 + 2 赞一个

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2019-10-15 13:39:00 | 显示全部楼层
不明白你为什么要用Join。Join要求第一个参数是字符串数组,用Double自然不行。

评分

参与人数 1威望 +8 人气 +2 收起 理由
bruly + 8 + 2 赞一个

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-15 13:46:22 | 显示全部楼层
Apple_0 发表于 2019-10-15 13:39
不明白你为什么要用Join。Join要求第一个参数是字符串数组,用Double自然不行。

用JOIN 是想 直接得到二维数组 A 中指定的某一行的数据,而不是通过逐一循环二维数组A的这一行来得到数据,因为这一行有1万个元素,逐一循环要花很久。
JOIN也许同样是通过循环得来的数据,我想速度可能会比我们用其它方法循环要快,故此有一问。
回复 支持 反对

使用道具 举报

发表于 2019-10-18 19:01:30 | 显示全部楼层
没有在群里问问大神吗?

评分

参与人数 1威望 +9 人气 +2 收起 理由
bruly + 9 + 2 赞一个

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-19 06:22:16 | 显示全部楼层
vbfans01 发表于 2019-10-18 19:01
没有在群里问问大神吗?

都问过,无解答
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-19 12:48:48 | 显示全部楼层
vbfans01 发表于 2019-10-19 08:45
我帮你在网上搜了一下,结论是用CopyMemory来复制数组问题多多,还不如用循环。@977348471

关于用CopyMe ...

感谢付出。我发现还不如用循环来得快。
您发的链接中的第一个是Long型的,后续一样无法使用split.所以不能派上用场。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2019-11-23 09:51

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表