C语言中怎么实现数组的缓存

g360z247j123 2015-08-10 04:23:49
最近需要用C语言对数组(基带信号)进行处理,由于算法原因需要各个子函数对接收到的数组进行缓存。比如在一次主循环中子函数Fun1输入长度为500的信号数组a1[500],和本地信号数组做运算后产生了一个新数组b输出,但原始数组a[500]的后面100个元素在下次循环中仍然需要使用(希望前400个元素被去掉),它要和下一次循环中输入Fun1的长度为500的数组拼接成一个新的数组a2[600]供处理用,结束后将a2[600]的后100个元素保留供下次循环使用,以此类推(上一次100+下一次500=600)......
现在想用calloc()函数动态分配缓存数组的大小,请问
1.怎么去掉a1[500]的前400个元素,即数组长度减为100,只保留后100个元素;
2.怎么实现剩余100个元素和新输入的500个元素拼接成a2[600]
关于问题1查资料有memset()函数,不过它只能把数组元素置为同一个值(比如为“0”),不能真正地去掉元素截断数组。关于问题2查资料有memcpy()函数,那么我该把缓存数组Cache1大小设为600吗?缓存数组Cache1它声明为全局数组or局部数组or局部静态数组,它是直接定义大小还是每次都动态分配呢?此外主函数主循环中对于子函数Fun2它的缓存大小Cache2(每次主循环要保留的元素个数)和Fun1不相同,Fun3与Fun1和Fun2都不同....等;在单个子函数(如Fun1)的子循环中运算时中间结果(数组)的长度需要不断缓存增加(类似于拼接),又该采用什么方式定义中间数组
...全文
966 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuangbao9 2015-08-14
  • 打赏
  • 举报
回复
引用 8 楼 g360z247j123 的回复:
[quote=引用 5 楼 kuangbao9 的回复:] 我记忆中数组一旦申请了维度是不能更改的。要想改变大小,可以考虑容器,像vector,list等。那可以删除和拼接。
嗯嗯,我这2天看了下链表,刚刚也看了一下vector,好像能实现数组的删除和拼接。 我要在主循环中实现每个子函数输出时数组前面的元素被删除,后面的被保留。同时在子函数的子循环中有从后面不停拼接(不停增加,但有最大长度)的,有不停删除前面部分元素(比如200)的,也有要实现先删除前面一个,接着从后面拼接进来一个的(比如开始数组大小为2,即s[2],然后删除第一个元素,接着从后面拼接进另一个元素,不停循环,保证数组长度不变)。更具体的要求情况可以看下面我给bear234的回复。 请问 我该采用什么结构比较好[/quote] 可以看看vector的,再看看泛型算法。
「已注销」 2015-08-13
  • 打赏
  • 举报
回复
你完全可以把一个包含 500 的元素的数组看成是 5 个包含 100 的元素的数组: arr[500]; 第一个数组 &arr[0] 第二个数组 &arr[100] 第三个数组 &arr[200] 第四个数组 &arr[300] 第五个数组 &arr[400]
bear234 2015-08-13
  • 打赏
  • 举报
回复
引用 7 楼 g360z247j123 的回复:
[quote=引用 6 楼 bear234 的回复:] [quote=引用 5 楼 kuangbao9 的回复:] 我记忆中数组一旦申请了维度是不能更改的。要想改变大小,可以考虑容器,像vector,list等。那可以删除和拼接。
realloc可以 楼主你用malloc或者calloc? 两者区别请看:(http://zhidao.baidu.com/link?url=eyTmOA33VVDCq5Qg6O3JFEEm2Sjs0olWyNqV5Rz6Cg-Jt0y8_lpLq9qq_dlxcpPbVLxhZ6Sex1D3dZL8usDBq_) 楼主,请你先把你的算法明确,然后看下如果你用malloc或者calloc是不是太多了,如果是,我建议你直接弄个大一点的数组,不要反复malloc calloc 和 realloc,这三个东西代价比较高 当然,如果你是在做嵌入式、可用空间很有限,当我没说[/quote] 你好!关于realloc( )函数,它扩大数组空间时比较好理解,当它缩小数组空间时是怎么回事? 比如有数组int a1[500],通过它扩大空间,p = (int *)realloc(a1,600),假如没有发生数据搬移(即p内存储的地址和a1相同)且分配成功,相当于在原有空间后增加100个int 型元素的空间;通过它缩小空间,q= (int *)realloc(a1,100),此时缩小损失的是前400个元素还是后400个元素?如果从a1[500]中的第401个元素a1[400]开始重新分配,即令q= (int *)realloc(&a1[400],100),这样能保留后100个元素吗? 刚刚看了一下,整个程序是这样的。最开始输入一帧数据(数组),它的长度可变(可大可小),记为SourceLen。为说明便利同上面设定SourceLen=500,即a1[500],然后输入给子函数Fun1,处理后依次给Fun2、Fun3...Fun10,然后主循环再次给Fun1输入新的500个数据,记为a2[500],接着给Fun2等依次处理,再主循环......总的循环次数可能有2000甚至更多。 a1[500]经过Fun1处理后输出数组大小约为500000,记为b1[5000000],b1经过Fun2后数组大小会变为原来的4倍,即c1[20000000],接着传递给后面的子函数,不过数组长度不会再增加,到Fun8时开始减小,最后Fun10输出长度回归500。所有子函数输入输出数组长度的变化规律不一定相同,但都是确定的(根据算法)。至于具体长度则受SourceLen的影响。 整个程序中我准备全部采用动态内存分配,malloc( )、calloc( )等。除了子函数Fun1外都需要实现类似数组缓存的功能(即去掉前面的部分元素保留后面的元素供下次循环使用)。有些数组缓存是供下次主循环用的,有些数组缓存是供该子函数内的下次子循环用的。我该怎么定义它们,固定分配or动态分配?它们的属性:比如全局数组,局部的or静态的? 开始我是采用Matlab来仿真,不过Matlab中关于数组(一维向量)的操作真的很方便,可以随意的连续赋值,置空(删除)和拼接;但是它的仿真速度实在是太慢了(好像数组的不定长拼接很耗时间),故希望采用C语言来提高速度。。。[/quote] 如此频繁使用数组 我个人建议你可以试着用c++ c++可以重载operator new 这个技术很少会用到 算是个偏一点的技术 不过可能适合你的这个问题 反复malloc realloc 也是很占用资源的
QIUSQJF 2015-08-12
  • 打赏
  • 举报
回复
如果你要循环那么多次,并且申请的内存那么大的话,不建议一直malloc free,你如果知道整个过程中内存需要的最大值的话,可以在最外层malloc(max - 100)出这么多空间记为A,再malloc 出100记为B,你只要把(value - 100)前的数存到A中,把后100个数存入B中,每次取数据都是先读取在B中100个数据,再从指定的长度L-100中从A取,然后循环,记住每次要读取的长度L就行了,这样相对来说数据就不需要移动太多;
g360z247j123 2015-08-12
  • 打赏
  • 举报
回复
引用 5 楼 kuangbao9 的回复:
我记忆中数组一旦申请了维度是不能更改的。要想改变大小,可以考虑容器,像vector,list等。那可以删除和拼接。
嗯嗯,我这2天看了下链表,刚刚也看了一下vector,好像能实现数组的删除和拼接。 我要在主循环中实现每个子函数输出时数组前面的元素被删除,后面的被保留。同时在子函数的子循环中有从后面不停拼接(不停增加,但有最大长度)的,有不停删除前面部分元素(比如200)的,也有要实现先删除前面一个,接着从后面拼接进来一个的(比如开始数组大小为2,即s[2],然后删除第一个元素,接着从后面拼接进另一个元素,不停循环,保证数组长度不变)。更具体的要求情况可以看下面我给bear234的回复。 请问 我该采用什么结构比较好
g360z247j123 2015-08-12
  • 打赏
  • 举报
回复
引用 6 楼 bear234 的回复:
[quote=引用 5 楼 kuangbao9 的回复:] 我记忆中数组一旦申请了维度是不能更改的。要想改变大小,可以考虑容器,像vector,list等。那可以删除和拼接。
realloc可以 楼主你用malloc或者calloc? 两者区别请看:(http://zhidao.baidu.com/link?url=eyTmOA33VVDCq5Qg6O3JFEEm2Sjs0olWyNqV5Rz6Cg-Jt0y8_lpLq9qq_dlxcpPbVLxhZ6Sex1D3dZL8usDBq_) 楼主,请你先把你的算法明确,然后看下如果你用malloc或者calloc是不是太多了,如果是,我建议你直接弄个大一点的数组,不要反复malloc calloc 和 realloc,这三个东西代价比较高 当然,如果你是在做嵌入式、可用空间很有限,当我没说[/quote] 你好!关于realloc( )函数,它扩大数组空间时比较好理解,当它缩小数组空间时是怎么回事? 比如有数组int a1[500],通过它扩大空间,p = (int *)realloc(a1,600),假如没有发生数据搬移(即p内存储的地址和a1相同)且分配成功,相当于在原有空间后增加100个int 型元素的空间;通过它缩小空间,q= (int *)realloc(a1,100),此时缩小损失的是前400个元素还是后400个元素?如果从a1[500]中的第401个元素a1[400]开始重新分配,即令q= (int *)realloc(&a1[400],100),这样能保留后100个元素吗? 刚刚看了一下,整个程序是这样的。最开始输入一帧数据(数组),它的长度可变(可大可小),记为SourceLen。为说明便利同上面设定SourceLen=500,即a1[500],然后输入给子函数Fun1,处理后依次给Fun2、Fun3...Fun10,然后主循环再次给Fun1输入新的500个数据,记为a2[500],接着给Fun2等依次处理,再主循环......总的循环次数可能有2000甚至更多。 a1[500]经过Fun1处理后输出数组大小约为500000,记为b1[5000000],b1经过Fun2后数组大小会变为原来的4倍,即c1[20000000],接着传递给后面的子函数,不过数组长度不会再增加,到Fun8时开始减小,最后Fun10输出长度回归500。所有子函数输入输出数组长度的变化规律不一定相同,但都是确定的(根据算法)。至于具体长度则受SourceLen的影响。 整个程序中我准备全部采用动态内存分配,malloc( )、calloc( )等。除了子函数Fun1外都需要实现类似数组缓存的功能(即去掉前面的部分元素保留后面的元素供下次循环使用)。有些数组缓存是供下次主循环用的,有些数组缓存是供该子函数内的下次子循环用的。我该怎么定义它们,固定分配or动态分配?它们的属性:比如全局数组,局部的or静态的? 开始我是采用Matlab来仿真,不过Matlab中关于数组(一维向量)的操作真的很方便,可以随意的连续赋值,置空(删除)和拼接;但是它的仿真速度实在是太慢了(好像数组的不定长拼接很耗时间),故希望采用C语言来提高速度。。。
kuangbao9 2015-08-11
  • 打赏
  • 举报
回复
我记忆中数组一旦申请了维度是不能更改的。要想改变大小,可以考虑容器,像vector,list等。那可以删除和拼接。
bear234 2015-08-11
  • 打赏
  • 举报
回复
引用 5 楼 kuangbao9 的回复:
我记忆中数组一旦申请了维度是不能更改的。要想改变大小,可以考虑容器,像vector,list等。那可以删除和拼接。
realloc可以 楼主你用malloc或者calloc? 两者区别请看:(http://zhidao.baidu.com/link?url=eyTmOA33VVDCq5Qg6O3JFEEm2Sjs0olWyNqV5Rz6Cg-Jt0y8_lpLq9qq_dlxcpPbVLxhZ6Sex1D3dZL8usDBq_) 楼主,请你先把你的算法明确,然后看下如果你用malloc或者calloc是不是太多了,如果是,我建议你直接弄个大一点的数组,不要反复malloc calloc 和 realloc,这三个东西代价比较高 当然,如果你是在做嵌入式、可用空间很有限,当我没说
赵4老师 2015-08-10
  • 打赏
  • 举报
回复
建议楼主学习循环FIFO缓冲区相关知识。
g360z247j123 2015-08-10
  • 打赏
  • 举报
回复
引用 2 楼 u010868023 的回复:
你可以在循环外面申请100个元素的空间 来保存最后100个元素
定义全局数组吗?可它怎么和新输入的500个元素拼接呢,还有对于子函数Fun2,Fun3....都要定义全局数组吗
没拦住車 2015-08-10
  • 打赏
  • 举报
回复
你可以在循环外面申请100个元素的空间 来保存最后100个元素
没拦住車 2015-08-10
  • 打赏
  • 举报
回复
你可以在循环外面申请100个元素的空间 来保存最后100个元素

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧