我提一个问题(VISUAL BASIC 程序设计简明教程6.0)变量内存
今天发现这本书一直在误导我! p100
多维数组在内存中的存储排列!
int a[3][4];
Dim a(2,3) as integer
不敢毒想,贴出来大家分享,同时求解决方法!
我们在C 里面都会用到指针,可以知道*(a[1]+i) 表示a[1][0],a[1][1],a[1][2]
a[1][3] 可见内存中是按行排列的!
在VB中我们不能使用指针,可是我们有一个操作内存的API函数,copymemory
我要拷贝a(1,0),a(1,1),a(1,2),a(1,3)
dim intTemp(3) as integer
call copymemory(intTemp(0),a(1,0),4*2)
按照教材上面说的,我能得到正确的结果,但是你猜得到什么了?
intTemp(0) = a(1,0)
intTemp(1) = a(2,0)
intTemp(2) = a(3,0)
intTemp(3) = a(0,1)
按列存储了!书再一次欺骗了我,请大家要注意哦!实践才是真理,邓小平说的没有错,呵呵
同时为了得到正确的数值,我到现在也不知道怎么做,我想是不是和堆,栈有关系呢,其实也没有关系,在VB中就是按列存储的!等高人来帮忙
[解决办法]
兩個紅褲衩,還要多高的人才算高人!
[解决办法]
呵呵,书啊!
我学VB的时候看的那本书倒是明确说明了VB数组是按列存储的
[解决办法]
还是和编译器有关的;
实践出真知啊
[解决办法]
Private Declare Sub CopyMemory Lib "kernel32 " Alias "RtlMoveMemory " (Destination As Any, Source As Any, ByVal Length As Long)
Dim intOldData(2, 9) As Integer
Dim intNewdata(9) As Integer
Private Sub Command1_Click(Index As Integer)
Dim i As Integer
Select Case Index
Case 0
Call CopyMemory(intNewdata(0), intOldData(0, 0), 20)
'//Check data
For i = 0 To 9
Debug.Print intNewdata(i)
Next i
Case 1
End Select
End Sub
Private Sub Form_Load()
Dim intIi As Integer
For intIi = 0 To 9
intOldData(0, intIi) = CInt(Rnd * 2000)
intOldData(1, intIi) = CInt(Rnd * 2000)
intOldData(2, intIi) = CInt(Rnd * 2000)
Debug.Print intOldData(0, intIi), intOldData(1, intIi), intOldData(2, intIi)
Next
Debug.Print "______________________________________ "
End Sub
还真是
[解决办法]
行列总是很晕人。。。C里面也是