数组索引超出数组界限限制怎么办

欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 3337 人关注过本帖
标题:数组上限问题
等 级:贵宾
威 望:12
帖 子:1629
专家分:3571
结帖率:98.62%
&&已结贴√
&&问题点数:100&&回复次数:6&&&
数组上限问题
VB中的一维数组有上限问题~记得是9万多~
不知道有方法可以突破吗?不想用二维阵列~
目前都是用结构去解决~不过还是想知道~
C的二维数组也有上限问题~记得是77万~
不知道有方法可以突破吗?想知道~
搜索更多相关主题的帖子:
等 级:版主
威 望:183
帖 子:4036
专家分:24893
&&得分:100&
数组的上限,是与内存分配有关的。
内存分配是以 64K为单位进行分配的,一维数组,要求内存是连续分配,当要求的内存超过规定值,就会出现错误。
解决办法,结构是一种,动态数组好像也可能突破这个范围。
C 里突破的办法就是用指针,自己申请内存,一块一块的申请内存,组成 链表,或 双向链表 。
我用下面代码测试:
Dim a() As Byte
Dim i As Long
Step 1048576
&&& ReDim a(1 To i)
当数组占用内存达到 284M 时报错。
(P4 2.8G ,1G,WINXP,VB6SP6)
授人于鱼,不如授人于渔
早已停用QQ了
等 级:贵宾
威 望:12
帖 子:1629
专家分:3571
你的例子是举一个字节为一单位~
若是字符串数组~
是否还得要加总所有的字符串数组占的字节数才行吗?
所以同一台PC机的可声明总量是固定的~
而index的长度会随着每段包含的字节数去除出来而会自动变化的意思吗?
不要選我當版主
等 级:贵宾
威 望:12
帖 子:1629
专家分:3571
C的话就等于双指针的意思吗?
每块阵列的第一个起始位址是第一个指针~
很多第一个指针变成另一个阵列~
而第二个指针起始位址就是第一个指针数组的最前面第一个位址的意思吗?
不要選我當版主
等 级:贵宾
威 望:12
帖 子:1629
专家分:3571
仔细思考了一下~若依照你这个逻辑来推算~
你1GB实体内存可以开到284M的长度~
那我如果在4GB实体内存不就可以开到284M*4的长度吗?
而编出的程序移植到1GB实体内存的PC去运行~
不就会产生溢位的问题~这合理吗?
就好比一般软件都会建议需要使用多少实体内存或硬盘空间来安装~
但是实际上低于它的建议值的PC~照样可以安装并且正常运行~
那就奇怪了~为何它不会溢位?
所以是否还得加上虚拟内存~
而现在硬盘随便基本上都500GB起跳~而一般预设使用操作系统自动控制虚拟内存大小~
所以阵列的最大值确定是跟实体内存大小有关系吗?
不要選我當版主
等 级:版主
威 望:183
帖 子:4036
专家分:24893
如果你所用到的数据超过一定数值,这里举例为200M以上时,都要用 临时文件。
VB这个很不好说,就用 C 来说
如果,我一共需要 64K*100000 块的数据,大约是 640M 。
组成一个 双向链表 ,
链表结构:
*上一块地址指针 //双向链表
*下一块地址指针
本块状态&&&&&&// 在临时文件还是在内存中
临时文件名*
*本块数据指针&&// 指向 一个64K内存块
当然,还有一个 指针保存链表的首指针 。
每次创建一个 链时,一个变量 自加 或 删除一个链时,就自减。
当引用一个链时,先判断本块状态,如果是在临时文件中,把么
首先 定义另外一个指针如 *bp ,然后这个 *bp 后退,如,我内存里最多保存 100个链的数据,
就后退 100个链,或者最远调用的链的算法找到一个没有使用的链, 然后把找到的链 写入临时文件,然后修改状态,释放掉内存。
然后 申请内存块,地址给数据指针,打开临时文件,读取数据。修改状态,
这样的话,内存里,保证 100个链,也就是 64M内存,而硬盘上的临时文件 就可以保存 640M 的数据。
--------------------
VB这样用 临时文件,很不现实,因为VB没有指针,无法做 链表。
这个话题,感觉还是放C版好。
--------------------
WIN 系统有一个统一内存管理。它并不是说 你有多大的实体内存就可以定义多大的数组。
数组大小我感觉与 用的编程语言有关,与实体内存大小无直接关系。
软件建议最低多少实体内存,就是告诉你,这个软件一般情况下(流畅运行),要占多少内存。
当你低于规定内存时,WIN系统会频繁调用虚拟内存,导致软件运行 很卡。
授人于鱼,不如授人于渔
早已停用QQ了
等 级:贵宾
威 望:12
帖 子:1629
专家分:3571
VB我目前通常都改用多层结构去解决单一阵列长度上限的问题~
当然为了效率~还得适时的释放资源~达到需求的功能~
因为以前遇过使用VB去调用自编的DLL档~但是却遇上DLL中声明的数组有上限问题~
求助于高手~有人回答是因为VB中调用DLL时~会先配给一块内存~
当超过内存大小时就会导致的DLL无法成功compile~当然这个答案我是存疑的~
所以就想VB是怎样去控制配给的DLL内存的大小的~
---------------------------------------------------------------------------
那NTFS的分页管理系统是否就是操作系统自动配置临时文件的功用?
---------------------------------------------------------------------------
C的部分讲解我大概懂了~至少有个方向了~果然没法像VB的这么简便~哈....
不要選我當版主
版权所有,并保留所有权利。
Powered by , Processed in 0.086685 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reserved2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。本帖子已过去太久远了,不再提供回复功能。不要在函数里面定义超过几十个字节的数组,不然很容易出问题。
定义全局变量,或者用内存管理
-------------------------------------------------------------------------------------
如果是在函数内部定义,应该有相关的栈大小限制的。
你一下子定义192K的数组,给堆栈和其他程序不留内存了吗?其他函数如果需要使用内存,却又申请不到内存就会出现硬件错误
-------------------------------------------------------------------------------------
看你是怎么定义的了,如果加了const,那就保存在ROM中。如果申明了数组但没初始化,那就是放在RAM中的;如果初始化了,数组放在RAM中,但数组初始化的数据放在ROM中,有程序从ROM复制到RAM。-------------------------------------------------------------------------------------我的程序进行了相关配置和修改之后,可以定义大数组了,但是前提是我必须屏蔽掉一些调用的函数,不然程序无法正确运行。 不屏蔽的话程序总会进入HardFault_Handler()函数,不知道哪里出了问题啊。--你一下子定义150K的数组,给堆栈和其他程序不留内存了吗?其他函数如果需要使用内存,却又申请不到内存就会出现硬件错误-------------------------------------------------------------------------------------我用的是MDK,启动代码里改的
在库文件里 Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
-------------------------------------------------------------------------------------
STM32芯片,如何将配置数据保存到Flash中?与程序一同写入Flash的吧?ST网上有例子程序的
如果用的是STM32f407,看以下路径
stm32f4discovery_fw\STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\FLASH_Program
103的基本上差不多
注意一下,你的配置数据存放的地址不用包括在编译器link的范围之内,会出问题的。
例如:告诉编译器:flash从0x80000开始,长度0x1000,你的配置数据的存放地址可从0x81000开始。这个地址的flash编译器link的时候肯定不会用我现在用的103的芯片,库里面的例程直接就能用!
本文已收录于以下专栏:
相关文章推荐
方法:static const uint8_t s_acBmpLogo030[len] __attribute__((at(0X800F000)))={0x80,0xC0,0xC0,0xC0,0xC0...
功能描述:今天做数据采集,TIM2定时中断20ms采集一次数据,并存入一个数组中。采集完4000个数据后,用串口将这4000个数据依次发送给上位机。
    问题描述:DEBUG中对数组指针ad...
电缆桥架 并且线槽走向统一 电线或电缆在钢线槽内不宜有接头,但在易于检查的场所,可允许在金属线槽内有分接头,电线、电缆和分接头的总截面(包括外护层)不应超过该总线槽内截面的75%;接头不得在穿过楼板或...
(1)//把调试设置普通IO口
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);  
调试时,出现 ***JLink Error:...
二维数组作为函数参数传递剖析(C语言)(6.19更新第5种)
  很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错:
//对于一个2行13列int元素的二维...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 超出数组界限 的文章

 

随机推荐