| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3521 人关注过本帖
标题:数组上限问题
只看楼主 加入收藏
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
结帖率:97.66%
收藏
已结贴  问题点数:100 回复次数:8 
数组上限问题
VB中的一维数组有上限问题~记得是9万多~
不知道有方法可以突破吗?不想用二维阵列~
目前都是用结构去解决~不过还是想知道~

C的二维数组也有上限问题~记得是77万~
不知道有方法可以突破吗?想知道~
搜索更多相关主题的帖子: 突破 
2012-01-13 19:25
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:100 
数组的上限,是与内存分配有关的。
内存分配是以 64K为单位进行分配的,一维数组,要求内存是连续分配,当要求的内存超过规定值,就会出现错误。
解决办法,结构是一种,动态数组好像也可能突破这个范围。

C 里突破的办法就是用指针,自己申请内存,一块一块的申请内存,组成 链表,或 双向链表 。

我用下面代码测试:

Dim a() As Byte
Dim i As Long
For i = 268435456 To 536870912 Step 1048576
    ReDim a(1 To i)
Next i

当数组占用内存达到 284M 时报错。
(P4 2.8G ,1G,WINXP,VB6SP6)

授人于鱼,不如授人于渔
早已停用QQ了
2012-01-13 20:16
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
你的例子是举一个字节为一单位~
若是字符串数组~
是否还得要加总所有的字符串数组占的字节数才行吗?
所以同一台PC机的可声明总量是固定的~
而index的长度会随着每段包含的字节数去除出来而会自动变化的意思吗?

不要選我當版主
2012-01-13 21:21
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
C的话就等于双指针的意思吗?
每块阵列的第一个起始位址是第一个指针~
很多第一个指针变成另一个阵列~
而第二个指针起始位址就是第一个指针数组的最前面第一个位址的意思吗?

不要選我當版主
2012-01-13 21:28
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
仔细思考了一下~若依照你这个逻辑来推算~
你1GB实体内存可以开到284M的长度~
那我如果在4GB实体内存不就可以开到284M*4的长度吗?
而编出的程序移植到1GB实体内存的PC去运行~
不就会产生溢位的问题~这合理吗?

就好比一般软件都会建议需要使用多少实体内存或硬盘空间来安装~
但是实际上低于它的建议值的PC~照样可以安装并且正常运行~
那就奇怪了~为何它不会溢位?

所以是否还得加上虚拟内存~
而现在硬盘随便基本上都500GB起跳~而一般预设使用操作系统自动控制虚拟内存大小~
所以阵列的最大值确定是跟实体内存大小有关系吗?

不要選我當版主
2012-01-14 04:28
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
如果你所用到的数据超过一定数值,这里举例为200M以上时,都要用 临时文件。
VB这个很不好说,就用 C 来说

如果,我一共需要 64K*100000 块的数据,大约是 640M 。
组成一个 双向链表 ,
链表结构:
*上一块地址指针 //双向链表
*下一块地址指针
本块状态      // 在临时文件还是在内存中
临时文件名*
*本块数据指针  // 指向 一个64K内存块

当然,还有一个 指针保存链表的首指针 。

每次创建一个 链时,一个变量 自加 或 删除一个链时,就自减。
当引用一个链时,先判断本块状态,如果是在临时文件中,把么
首先 定义另外一个指针如 *bp ,然后这个 *bp 后退,如,我内存里最多保存 100个链的数据,
就后退 100个链,或者最远调用的链的算法找到一个没有使用的链, 然后把找到的链 写入临时文件,然后修改状态,释放掉内存。
然后 申请内存块,地址给数据指针,打开临时文件,读取数据。修改状态,

这样的话,内存里,保证 100个链,也就是 64M内存,而硬盘上的临时文件 就可以保存 640M 的数据。
--------------------
VB这样用 临时文件,很不现实,因为VB没有指针,无法做 链表。
这个话题,感觉还是放C版好。

--------------------
WIN 系统有一个统一内存管理。它并不是说 你有多大的实体内存就可以定义多大的数组。
数组大小我感觉与 用的编程语言有关,与实体内存大小无直接关系。
软件建议最低多少实体内存,就是告诉你,这个软件一般情况下(流畅运行),要占多少内存。
当你低于规定内存时,WIN系统会频繁调用虚拟内存,导致软件运行 很卡。

授人于鱼,不如授人于渔
早已停用QQ了
2012-01-14 09:29
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
VB我目前通常都改用多层结构去解决单一阵列长度上限的问题~
当然为了效率~还得适时的释放资源~达到需求的功能~
因为以前遇过使用VB去调用自编的DLL档~但是却遇上DLL中声明的数组有上限问题~
求助于高手~有人回答是因为VB中调用DLL时~会先配给一块内存~
当超过内存大小时就会导致的DLL无法成功compile~当然这个答案我是存疑的~
所以就想VB是怎样去控制配给的DLL内存的大小的~
---------------------------------------------------------------------------
那NTFS的分页管理系统是否就是操作系统自动配置临时文件的功用?
---------------------------------------------------------------------------
C的部分讲解我大概懂了~至少有个方向了~果然没法像VB的这么简便~哈....

不要選我當版主
2012-01-14 13:57
ysr2857
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:34
帖 子:809
专家分:77
注 册:2020-2-10
收藏
得分:0 
上限好像是20亿个字节吧?
2021-02-03 20:09
ysr2857
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:34
帖 子:809
专家分:77
注 册:2020-2-10
收藏
得分:0 
VB 字符串数组最大容量:
1)VB6.0中关于String数据类型的说明如下:

字符bai串有两种:变长与定长的字符串。

*变长字符串最多可包含大约 20 亿 ( 2^31)个字符。
*定长字符串可包含 1 到大约 64K ( 2^16 ) 个字符。

浏览器中复制粘贴过来的,供参考,欢迎讨论指导!
2021-02-03 20:18
快速回复:数组上限问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016000 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved