回 帖 发 新 帖 刷新版面

主题:[讨论]定长或静态数据不能大于64K。局部非静态变量太多

Option Explicit

Private Type a   '8 * 10 个字节    
    a0 As Double
    a1 As Double
    a2 As Double
    a3 As Double
    a4 As Double
    a5 As Double
    a6 As Double
    a7 As Double
    a8 As Double
    a9 As Double
End Type

Private Type b   '8 * 10 个字节
    b0 As Double
    b1 As Double
    b2 As Double
    b3 As Double
    b4 As Double
    b5 As Double
    b6 As Double
    b7 As Double
    b8 As Double
    b9 As Double
End Type

Private Type c   '8 * 10 个字节
    c0 As Double
    c1 As Double
    c2 As Double
    c3 As Double
    c4 As Double
    c5 As Double
    c6 As Double
    c7 As Double
    c8 As Double
    c9 As Double
End Type

Private Type d   '8 * 10 个字节
    d0 As Double
    d1 As Double
    d2 As Double
    d3 As Double
    d4 As Double
    d5 As Double
    d6 As Double
    d7 As Double
    d8 As Double
    d9 As Double
End Type

Private Type m    '64KB / 80 Byte /4=204.8,所以全部设置为210,则会超过64K
    ma(210) As a
    mb(200) As b    '如果都改为210,则提示定长或静态数据不能大于64K
    mc(200) As c
    md(200) As d
End Type

Private Type m1    '使用动态数组,在运行时可以分配大于64K。
    ma() As a    [color=red]'但这种方式就真的没有限制吗?[/color]
    mb() As b
    mc() As c
    md() As d
End Type

Private Sub Command1_Click()
'Static t As m    '定义为静态变量,Ok
'Dim t As m    '出现错误:局部,非静态变量太多
Dim t1 As m1    'Ok
ReDim t1.ma(210) As a
ReDim t1.mb(210) As b
ReDim t1.mc(210) As c
ReDim t1.md(210) As d
End Sub

VB里的内存分配时堆、栈的使用是怎样的?请各位大佬指点。。。

回复列表 (共6个回复)

沙发

= =;
还真有心情搞。


Private Type ar    
    n(0 To 32635) As Byte    
    ' 1~32636 , 0~32635, 1~0x7F7C, 0~0x7F7B
    ' 分析,VB6里的栈不能超过 0x7fff=32767 个字节。个人理解,有误请发表意见。
End Type

Private Sub Form_Load()
    Dim a As ar
    end
End Sub

'==================================我是分割线==========================
' 再来


Private Type ar    
    n(1 To 32632) As Byte     
    ' 1~32636 , 0~32635, 1~7F7C, 0~7F7B
End Type

Private Sub Form_Load()
    Dim a As ar
    Dim i() As Byte '一个地址又要了4字节的栈.使用动态数组,在运行时可以分配大于64K。
    ReDim i(0 To &H1F000000) 'OLE数组,= =;不知道是怎么样动态分配内存的?&H1F000000 都没挂,不过我这里有点危险了= =;
End Sub

板凳

因为在设计一个程序时用到了多个结构的嵌套,怕按照这样的思路把代码写出来后才发现根本运行不了。所以先试了试。
[quote]VB6里的栈不能超过 0x7fff=32767 个字节[/quote]
那为何
Private Type ar    
    n(0 To [color=red]32636[/color]) As Byte    '32635可以,32636不行
End Type

32767怎么得来的?

对于static 和动态数组,不知道是怎么分配的。 

3 楼

n(0 To 32636) As Byte    '32635可以,32636不行

可以这样啊:把下限设成负值。
试试如何?

4 楼

= =;
不都差不多!~ 还是说一样?

    n(-32635 To 0) As Byte

5 楼

'当日记用。 m(_ _)m

Option Explicit

Private Type ar
    n(1 To 32634) As Byte
    ' 1~32636 , 0~32635, 1~0x7F7C, 0~0x7F7B
End Type

Private Sub Form_Load()
    Dim a As ar
    fn1
    End
End Sub

'需要压栈,单位 字节
'Byte    2
'Boolean 2
'Long    4
'Double  8
'Variant 16
Function fn1() As Byte
    '
End Function

6 楼

[quote]n(0 To 32636) As Byte    '32635可以,32636不行
可以这样啊:把下限设成负值。
试试如何?[/quote]

差不多的啊。容量还是一样的。
在声明一个局部非静态变量时还是提示“局部,非静态变量太多”
如Dim t As ar


我来回复

您尚未登录,请登录后再回复。点此登录或注册