如何读取数组的c文件,在内存中映射成真正的数组

2020-01-01 17:48发布

介绍下问题提出背景,我的程序中有个90多k的数组,70%以上都是连续的0,我打算用rle算法压缩,估计降低一半以上大小是可行的

初步思路是搞个上位机的命令行程序,读取这个数组c文件,压缩后生成一个bin文件,mdk支持在编译前运行命令,然后mdk装载这个bin文件生成最后的程序文件,整个过程都会自动完成

现在事情还没开始就遇上一个麻烦事,如何读取数组c文件,因为这个3维数组使用嵌套大括号表示数组层次,连续的0其实都是没标出的,编译器当然明白这些,但是如果自己来做的话就要自己解析这个数组c文件到内存里,这个也不是一会儿功夫可以搞定的啊

请问谁有这方面的经验,或者有开源的库可以干这个活呢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
35条回答
myxiaonia
1楼-- · 2020-01-02 14:37
takashiki 发表于 2016-7-27 10:27
你的题目要求不是要搞个上位机命令行程序吗,那就用TCC写个脚本就完了,根本不用你去编译,MDK编译前先调 ...

我去看了下tcc介绍,这个tcc还真是牛啊,把c当脚本用,我赶紧去试试看再来汇报下

以前没发现有这样的好东西,都是用vc写命令行程序再用mdk调用的
takashiki
2楼-- · 2020-01-02 19:38
myxiaonia 发表于 2016-7-27 10:30
是mdk里面有个大数组,我希望这个大数组是压缩后编译到最后的程序文件里,再里面解压恢复,

因为程序真 ...

说真的,就你这个需求,个人认为使用miniLZO、QuickLZ之类的,要比你的RLE压缩要好得多,压缩率会高不少,但解压时的时间和资源增加却并不多。
TCC当然牛X了,可以自己当解释器(其实是编译器),还可以通过源代码直接嵌入到宿主程序中。
myxiaonia
3楼-- · 2020-01-03 01:25
takashiki 发表于 2016-7-27 10:37
说真的,就你这个需求,个人认为使用miniLZO、QuickLZ之类的,要比你的RLE压缩要好得多,压缩率会高不少 ...

之前也是找适合单片机的压缩算法,也看到了你所说的miniLZO,不过不清楚解压时候是否必须整个文件都解压完,rle比较简单,可以指定到任意偏移位置处获取解压数据,不知道你谈到的这两种算法是否也有这样的特征

而且我在看lzss的资料时有提到最少64k内存我就吐血了,我用的stm32型号最大就是64k,这可怎么整
aozima
4楼-- · 2020-01-03 02:44
 精彩回答 2  元偷偷看……
myxiaonia
5楼-- · 2020-01-03 02:55
aozima 发表于 2016-7-27 11:27
就1个数组,直接再写几行C,然后运行一下写成一个bin文件,前后5分钟搞定。

...

这个数组是部分初始化的,3维数组,用3层{}嵌套初始化,要初始化成0的地方,不是显式而是通过{}隐式的,c意义下的数组,里面还有注释
takashiki
6楼-- · 2020-01-03 07:33
myxiaonia 发表于 2016-7-27 11:07
之前也是找适合单片机的压缩算法,也看到了你所说的miniLZO,不过不清楚解压时候是否必须整个文件都解压 ...

LZSS、LZARI、LZ77、LZW、LZ4等等解压都需要大内存
LZO、QuickLZ解压是不占用内存资源的(QuickLZ可选占用多大,我一般都选0),就函数内部几个临时变量的消耗,ROM是要占用一些,在1K级别的样子。
他们都无法指定任意位置开始解压,只能把你这80个二维数组单独压缩为80个单独的数组,然后完整的解压那1K内容。

一周热门 更多>