VBGood網站全文搜索 Google

搜索VBGood全站網頁(全文搜索)

VB愛好者樂園(VBGood)

 找回密碼
 立即注冊
搜索
查看: 966|回復: 7
打印 上一主題 下一主題

[討論] 無效的過程調用或參數:Debug.Print Join(B) 怎么修正?

[復制鏈接]
跳轉到指定樓層
1
發表于 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

使用道具 舉報

2
發表于 2019-10-15 13:39:00 | 只看該作者
不明白你為什么要用Join。Join要求第一個參數是字符串數組,用Double自然不行。

評分

參與人數 1威望 +8 人氣 +2 收起 理由
bruly + 8 + 2 贊一個

查看全部評分

回復 支持 反對

使用道具 舉報

3
 樓主| 發表于 2019-10-15 13:46:22 | 只看該作者
Apple_0 發表于 2019-10-15 13:39
不明白你為什么要用Join。Join要求第一個參數是字符串數組,用Double自然不行。

用JOIN 是想 直接得到二維數組 A 中指定的某一行的數據,而不是通過逐一循環二維數組A的這一行來得到數據,因為這一行有1萬個元素,逐一循環要花很久。
JOIN也許同樣是通過循環得來的數據,我想速度可能會比我們用其它方法循環要快,故此有一問。
回復 支持 反對

使用道具 舉報

5
發表于 2019-10-18 19:01:30 | 只看該作者
沒有在群里問問大神嗎?

評分

參與人數 1威望 +9 人氣 +2 收起 理由
bruly + 9 + 2 贊一個

查看全部評分

回復 支持 反對

使用道具 舉報

6
 樓主| 發表于 2019-10-19 06:22:16 | 只看該作者
vbfans01 發表于 2019-10-18 19:01
沒有在群里問問大神嗎?

都問過,無解答
回復 支持 反對

使用道具 舉報

8
 樓主| 發表于 2019-10-19 12:48:48 | 只看該作者
vbfans01 發表于 2019-10-19 08:45
我幫你在網上搜了一下,結論是用CopyMemory來復制數組問題多多,還不如用循環。@977348471

關于用CopyMe ...

感謝付出。我發現還不如用循環來得快。
您發的鏈接中的第一個是Long型的,后續一樣無法使用split.所以不能派上用場。
回復 支持 反對

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

GMT+8, 2020-2-5 20:02

VB愛好者樂園(VBGood)
快速回復 返回頂部 返回列表
广西快3开奖结果直播