注册 登录
编程论坛 VB6论坛

VB6.0的数组的上界上限是多少?是整型的范围么?

小刀神 发布于 2018-09-18 18:19, 6196 次点击
VB6.0的数组的上界上限是多少?是整型的范围么?
14 回复
#2
ZHRXJR2018-09-18 18:31
VB6.0的说明中说:VB6.0的数组下标的范围是 0 到 32767,应该是正整数范围,不包含负整数,整数的范围是 -32768 到 32767 。最大维数好像是60维。

[此贴子已经被作者于2018-9-18 18:59编辑过]

#3
小刀神2018-09-18 21:43
回复 2楼 ZHRXJR
可是我在申请动态数组的时候,老是出现内存溢出,想找找问题所在……
程序代码:

Dim Commpents_Name_Style() As String
Private Sub Form_Load()
ReDim Commpents_Name_Style(1 To 30000,1 To 30000,1 To 30000) As String
End Sub

顺便问问,如何可以在不声明数组的下界和上界的情况下,申请三维数组?
#4
ZHRXJR2018-09-19 09:40
关于多维数组的下标,VB文档中没有提及,我使用过的三维数组的下标没有超过200,至于到底三维数组的下标是多少的确无法回答你。
刚刚测试了一下,如果是 ReDim Commpents_Name_Style(1 To 511, 1 To 511, 1 To 511) 不会溢出,大于 511 就会溢出
在声明动态数组的时候已经声明了数组的数据类型,在 ReDim 时不要再次声明数据类型了。
关于你说的:“如何可以在不声明数组的下界和上界的情况下,申请三维数组?”我认为办不到,因为数组使用前必须要声明。

另外不知道你使用这样大的三维数组是做什么用的,一般好像是 Dim AA(1 To 5, 1 To 200, 1 To 30000) As String 这样的,下标是不一样的,即就是二维数组,各维的下标也是不一样的,你的这种很特别。
#5
风吹过b2018-09-19 13:16
好像 VB 固定大小的数组有一个 占用内存不得超过 64K 的限制。
但我测试失败,这个限制值是多少,不清楚了。
Const aMax = 2 ^ 26
Dim a(aMax) As Long
这个不报错,但 2^27 时就报错。

三维超大数组,那你想办法改成 结构吧!好像这个可以突破内存的限制。

VB6.0的数组下标的范围是 0 到 32767
这个是 控件数组的限制。
#6
小刀神2018-09-19 14:07
回复 4楼 ZHRXJR
现在设计的一个程序,最终点击了文件保存和编译的时候,方才会将数据一一输出到文件,所以,中途使用软件设计的时候,并不会自生成数据,写出文件,以致于中途设计的时候需要一些变量来存储这些临时数据,而最好的办法,便是使用三维数组,也是最为简便的方法了,而我之所以会使用如此大范围的数组,是因为我怕,存储临时数据的时候,很容易超出数组的承受范围,以至于出现程序保存的情况,所以想着尽量放大数组的范围,让程序不易出现程序报错,而数据也能够一一临时存储起来。
#7
小刀神2018-09-19 14:07
回复 5楼 风吹过b
怎么改?
#8
wube2018-09-19 17:03
厉害了我的天啊,居然用到三维

结构 : 一样有64K限制
程序代码:

Private Type C
    Third() As String
End Type
Private Type B
    Second() As C
End Type
Private Type A
    First() As B
End Type
Private AA As A
#9
wube2018-09-19 17:08
32723=>三维整型最大量
程序代码:

Private Type C
    Third(32723) As Integer
End Type
Private Type B
    Second As C
End Type
Private Type A
    First As B
End Type
Private AA As A


所以应该是三个()乘积需小于32723
程序代码:

Private Type C
    Third() As Integer
End Type
Private Type B
    Second() As C
End Type
Private Type A
    First() As B
End Type
Private AA As A


不过实际应用上从没用到这么大的值或资料
若真有这种需求建议改变一下程式逻辑

[此贴子已经被作者于2018-9-19 17:13编辑过]

#10
小刀神2018-09-19 18:17
回复 9楼 wube
那使用自定义数据类型可以不?用三个数组定义一个数据类型,每个数组的上界为30000,这应该没有问题了吧?
#11
风吹过b2018-09-19 19:05
关键在你的几组数据。
按3楼:如果每组数据是 一维数组,也就是 30000*30000个元素,然后有30000组数据
按10楼:每组数据为 3*30000,一共30000组
这个数据量的级别也差的太多了吧!
1万倍呀

你学一下动态数组吧,使用结构体配合动态数组来做的你程序,需要多少个元素,就动态修改成多少个元素。
贴一下你的数据结构需求。

#12
wube2018-09-20 10:37
类似这问题我在C版看过,不管数组或结构甚至自定义型态,每个都佔内存空间,全部加一加使用内存不超过64K就行了~
#13
小刀神2018-09-20 11:30
回复 12楼 wube
超过64KB应该不至于吧,我只是存储一些文本型数据而已,而之所以选择数组并设高范围的上界,是因为,我需要把这些数据作出分类,然后根据这些分类输出数据,写出文件到电脑中。
顺便先问问结构,你们一直所说的结构,能够具体地介绍一下么?
#14
小刀神2018-09-20 11:41
回复 11楼 风吹过b
我一直很想知道,你们一直所说的结构,能够具体地介绍一下么?
#15
风吹过b2018-09-20 12:43
给了一段自己写的 代码,你自己慢慢看结构吧!  为结构 + 动态数组,操作方法也是一个二进制文件完全读取内存里去。
代码假设文件数据完整,非压缩。没有去检验任何可能出现错误的数据,包括文件大小都没检验。

程序代码:

Option Explicit

'Bmp公用函数

'BMP压缩类型,
Public Const BI_RGB = 0     '非压缩
Public Const BI_RLE8 = 1
Public Const BI_RLE4 = 2

Public Type BMP文件头结构类型
    文件类型标识 As String * 2      '二字节长,只能为BM
    文件长度 As Long                '文件长度,4字节
    保留字1 As Integer              '系统保留,2字节,只能为0
    保留字2 As Integer              '系统保留,2字节,只能为0
    数据起始位置 As Long            '数据起始位置,相对数据头
End Type
   
Public Type BMP文件颜色表类型
    蓝 As Byte
    绿 As Byte
    红 As Byte
    保留 As Byte
End Type
   
Public Type BMP文件位图信息头类型
    本结构长度 As Long              '本结构的长度,包含颜色表的
    图像宽 As Long                  '图像宽
    图像高 As Long                  '图像高
    目标设备级别 As Integer         '目标设备级别,只能为1
    色彩位数 As Integer             '每像素色彩位数,只能为1(双色),4(16色),8(256色),24(真彩) 四种
    压缩 As Long                    '是否是压缩的,必须是 0(不压缩), 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
    位图大小 As Long                '位图数据区的大小
    位图水平分辨率 As Long          '位图水平分辨率,每米像素数,好像可以为零
    位图垂直分辨率 As Long          '位图垂直分辨率,每米像素数,好像可以为零
    使用的颜色数 As Long            '位图实际使用的颜色表中的颜色数
    重要的颜色数 As Long            '位图显示过程中重要的颜色数
'
    颜色表() as BMP文件颜色表类型   '颜色表,=色彩位数^2 ,色彩位数为24时,无颜色表
End Type

Public Type BMP扫描行类型
    X() As Byte
    空() As Byte
End Type

Public Type BMP文件类型
    文件标识 As BMP文件头结构类型
    位图信息 As BMP文件位图信息头类型
    颜色表() As BMP文件颜色表类型   '颜色表,=色彩位数^2 ,色彩位数为24时,无颜色表
    数据() As BMP扫描行类型         '位图数据,合并为每个像素一个long值
End Type


'当biBitCount=1时,8个像素占1个字节;
'
当biBitCount=4时,2个像素占1个字节;
'
当biBitCount=8时,1个像素占1个字节;
'
当biBitCount=24时,1个像素占3个字节;
'
Windows规定一个扫描行所占的字节数必须是
'
4的倍数(即以long为单位),不足的以0填充,
'
一个扫描行所占的字节数计算方法:
'
DataSizePerLine= (biWidth* biBitCount+31)/8;
'
// 一个扫描行所占的字节数
'
DataSizePerLine= DataSizePerLine/4*4; // 字节数必须是4的倍数
'
位图数据的大小(不压缩情况下):
'
DataSize= DataSizePerLine* biHeight;


Public Function openbmp(Bmpfile As String, ByRef BMP文件 As BMP文件类型) As Integer
'打开BMP文件,读取数据
If Dir(Bmpfile) <> "" Then
Dim fj As Long
Dim i As Long
Dim colortmp() As Long
Dim 扫描行 As Long, 保留 As Long


With BMP文件
    fj = FreeFile()
    Open Bmpfile For Binary As #fj
        Get #fj, , .文件标识        '读文件标识
        If .文件标识.文件类型标识 = "BM" Then   '是BMP文件否
            Get #fj, , .位图信息
                ReDim .数据(.位图信息.图像高 - 1)
               
                扫描行 = (.位图信息.图像宽 * .位图信息.色彩位数) / 8
                保留 = 4 - (扫描行 Mod 4)
                For i = 0 To .位图信息.图像高 - 1
                    ReDim .数据(i).X(扫描行 - 1)
                    If 保留 > 0 And 保留 < 4 Then
                        ReDim .数据(i).空(保留 - 1)
                    End If
                Next i
            
                Select Case .位图信息.色彩位数
                    Case 1                  '2色图片
                        ReDim .颜色表(1)        '初始化颜色表数据
                        Get #fj, , .颜色表      '读颜色表
                        For i = 0 To .位图信息.图像高 - 1
                            Get #fj, , .数据(i).X
                            Get #fj, , .数据(i).空
                        Next i
                    Case 4                  '16色图片
                        ReDim .颜色表(15)       '初始化颜色表数据
                        Get #fj, , .颜色表      '读颜色表
                        For i = 0 To .位图信息.图像高 - 1
                            Get #fj, , .数据(i).X
                            Get #fj, , .数据(i).空
                        Next i
                    Case 8                  '256色图片
                        ReDim .颜色表(255)      '初始化颜色表数据
                        Get #fj, , .颜色表      '读颜色表
                        
                        For i = 0 To .位图信息.图像高 - 1
                            Get #fj, , .数据(i).X
                            Get #fj, , .数据(i).空
                        Next i
                        
                    Case 24                  '真彩图片,无颜色表
                        'i = (.位图信息.图像宽 - 1) * (.位图信息.图像高 - 1)
                        'ReDim .数据(i)
                        'ReDim .数据(.位图信息.图像宽, .位图信息.图像高, 2)
                        For i = 0 To .位图信息.图像高 - 1
                            Get #fj, , .数据(i).X
                            Get #fj, , .数据(i).空
                        Next i
                End Select
            
        Else        '文件标识不对,打开失败
            openbmp = -2
        End If
    Close #fj
End With
Else    '文件不存在,打开失败
    openbmp = -1
End If
End Function

Public Function viewbmp(BMP文件 As BMP文件类型, PIC As PictureBox) As Integer

Dim i As Long, j As Long, k As Long, n As Byte
Dim i1 As Integer, i2 As Integer
Dim ycon() As Long


With BMP文件
PIC.Cls
If .位图信息.色彩位数 < 24 Then
    i1 = .位图信息.色彩位数 ^ 2
    ReDim ycon(i1)
    For i = 0 To i1
        ycon(i) = RGB(.颜色表(i).红, .颜色表(i).绿, .颜色表(i).蓝)
    Next i
End If
For i = 0 To .位图信息.图像高 - 1
'    For j = 1 To .位图信息.图像高
        Select Case .位图信息.色彩位数
        Case 1
            For j = 0 To (.位图信息.图像宽 / 8)
                For k = 0 To 7
                    n = 2 ^ (7 - k)
                    If j * 8 + k < .位图信息.图像宽 Then
                        i1 = .数据(i).X(j) And n / n        '第n位
                        PIC.PSet (j * 8 + k, .位图信息.图像高 - i), ycon(i1)
                    End If
                Next k
            Next j
        
        Case 4
            For j = 0 To (.位图信息.图像宽 / 2) - 1
                i1 = .数据(i).X(j) \ 16        '高位
                i2 = .数据(i).X(j) Mod 16      '低位
                PIC.PSet (j * 2, .位图信息.图像高 - i), ycon(i1)
                PIC.PSet (j * 2 + 1, .位图信息.图像高 - i), ycon(i2)
            Next j
            If j * 2 < .位图信息.图像宽 Then        '还少了一点
                i1 = .数据(i).X(j) \ 16        '高位
                PIC.PSet (j * 2, .位图信息.图像高 - i), ycon(i1)
            End If
        
        Case 8
            For j = 0 To .位图信息.图像宽 - 1
                PIC.PSet (j, .位图信息.图像高 - i), ycon(.数据(i).X(j))
            Next j
        
        Case 24
            For j = 0 To .位图信息.图像宽 - 1
                PIC.PSet (j, .位图信息.图像高 - i), RGB(.数据(i).X(j * 3 + 2), .数据(i).X(j * 3 + 1), .数据(i).X(j * 3 + 0))
            Next j
'    Next j
        End Select
Next i
End With
End Function


[此贴子已经被作者于2018-9-20 12:47编辑过]

1