最强的 2维数组问题,能回答这个问题的基本 VB毕业了,满分求教

shakoe 2012-01-26 10:57:23
已有一个函数声明如下

sub subA(a() as long) 'subA 的参数为一个一维数组



已有一个二维数组如下

dim b(100,100) as long





问,怎么把b的第二个数组元素 b(1,)传递到subA,我需要的是直接传递,而不是再声明一个中间传递什么的,没有这个计算时间


...全文
197 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
一滴泪 2012-01-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sysdzw 的回复:]

听说有分
[/Quote]
你的爬虫呢?
舉杯邀明月 2012-01-28
  • 打赏
  • 举报
回复

shakoe 2012-01-27
  • 打赏
  • 举报
回复
谢谢各位,非常感谢,问题本身就有问题,所有会平均散分给诸位
iollcy 2012-01-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wallescai 的回复:]

引用 5 楼 iollcy 的回复:

直接複製數組的話,肯定沒交換指針快
換個指針只需要Copy 4字節
而複製整個數組,需要4*100=400字節
當然,這麼做如果subA修改了數組,那麼那個2維數組也會被改變


交换指针需要做一些前期准备, 还需要做好收尾工作,否则程序会挂掉,对于不熟悉的人来说实在是很危险的用法。 如果真的是熟悉的话也不会提出这问题了。
[/Quote]

不熟悉的話,可以去學一下VB關於指針的技術,這個帖子作為LZ去學指針的契機不也很好么
附上AdamBear關於指針和數組的兩篇文章,我當初就看的這個
http://blog.csdn.net/adambear/article/details/13700
http://blog.csdn.net/adambear/article/details/13702

當然AdamBear這系列的文章都很不錯,建議LZ有時間的話都讀一下
http://blog.csdn.net/adambear/
捧剑者 2012-01-26
  • 打赏
  • 举报
回复
熊孩子开学喽 2012-01-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 iollcy 的回复:]

直接複製數組的話,肯定沒交換指針快
換個指針只需要Copy 4字節
而複製整個數組,需要4*100=400字節
當然,這麼做如果subA修改了數組,那麼那個2維數組也會被改變
[/Quote]

交换指针需要做一些前期准备, 还需要做好收尾工作,否则程序会挂掉,对于不熟悉的人来说实在是很危险的用法。 如果真的是熟悉的话也不会提出这问题了。
iollcy 2012-01-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wallescai 的回复:]

二维数组的内存排列顺序是按照先左后右来的。
举个例子给楼主看就明白了:
假设有A(2,2),按照数组在内存中连续排列的次序读出来是这样的:
A(0,0),A(1,0),A(2,0),A(0,1),A(1,1),A(2,1),A(0,2),A(1,2),A(2,2)
所以,如果是要求A(X,1)或者A(X,2)这样的方式,还是有可能实现的。
其实也不用2楼那么复杂, 如果原来二维数组A(……
[/Quote]
直接複製數組的話,肯定沒交換指針快
換個指針只需要Copy 4字節
而複製整個數組,需要4*100=400字節
當然,這麼做如果subA修改了數組,那麼那個2維數組也會被改變
熊孩子开学喽 2012-01-26
  • 打赏
  • 举报
回复
二维数组的内存排列顺序是按照先左后右来的。
举个例子给楼主看就明白了:
假设有A(2,2),按照数组在内存中连续排列的次序读出来是这样的:
A(0,0),A(1,0),A(2,0),A(0,1),A(1,1),A(2,1),A(0,2),A(1,2),A(2,2)
所以,如果是要求A(X,1)或者A(X,2)这样的方式,还是有可能实现的。
其实也不用2楼那么复杂, 如果原来二维数组A(M,N)要用到从A(0,I)到A(M,I)这么一维的话,
只需要定义一维数组B(M),然后
copymemory b(0),VarPtr(a(0,I)),数据类型长度*M
即可
贝隆 2012-01-26
  • 打赏
  • 举报
回复
楼主的要求不现实
虽然传递数组等于传递地址,但同时还传递了长度。所以,你的要求应该不能实现。
iollcy 2012-01-26
  • 打赏
  • 举报
回复
你說的根本辦不到,因為b(1,0)在內存中不是連續的
先是b(x,0),x∈[0,100]
排滿之後再拍b(x,1),一直排到b(x,100)
下面的代碼會證明
所以說,如果你想傳b(,1)的話,還是行得通的,不過也不能直接傳
要構造一個SafeArray,不過由於都是指針操作,不用複製數組,所以也是非常快的,所用時間幾乎可以忽略
下面上代碼,證明了傳b(1,)不可行以及傳b(,1)的方法
Option Explicit

Private Type SAFEARRAYBOUND
cElements As Long
lLbound As Long
End Type

Private Type SAFEARRAY1D
cDims As Integer
fFeatures As Integer
cbElements As Long
cLocks As Long
pvData As Long
Bounds As SAFEARRAYBOUND
End Type

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
'Private Declare Sub CopyMemory_VA Lib "kernel32" Alias "RtlMoveMemory" (Destination() As Any, Source As Any, ByVal Length As Long)
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Var() As Any) As Long

Private Sub Form_Load()
Dim b(100, 100) As Long, tmpArray() As Long
Dim SafeArray As SAFEARRAY1D
Dim i As Long
For i = 0 To 100
b(i, 1) = i
Next
With SafeArray
.cDims = 1
.fFeatures = 0
.cbElements = 1
.cLocks = 0
.pvData = VarPtr(b(0, 1))
.Bounds.lLbound = 0
.Bounds.cElements = 101
End With

'用VA的可以直接傳數組,效率上會高一些,不過不太方便
'CopyMemory_VA tmpArray(), VarPtr(SafeArray), 4
CopyMemory ByVal VarPtrArray(tmpArray()), VarPtr(SafeArray), 4&
subA tmpArray()
CopyMemory ByVal VarPtrArray(tmpArray()), 0&, 4& '還原現場,由於tmpArray()是空數組,所以是0
End Sub

Sub subA(a() As Long)
Dim i As Long, s As String
For i = 0 To UBound(a())
s = s & CStr(a(i)) & " " '不要吐槽&的渣效率,這里只是做個示範而已
Next
MsgBox s
End Sub

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧