Keil C程序中定义的一维数组字节过大该怎么办?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keil C程序中定义的一维数组字节过大该怎么办?相关的知识,希望对你有一定的参考价值。

该程序的功能是左移循环显示十个汉字,需要先将汉字的编码存入缓存文件中,但是只能存入192个字节即6个汉字的编码能够编译成功,现在我想显示10个汉字也即是说要存入320个字节到缓存数组当中去,但是Keil C程序编译如下:
MAIN.C(15): error C249: 'IDATA': SEGMENT TOO LARGE
Target not created
部分用到缓存数组的源程序如下:
unsigned char idata huancun[320];
tmp=~huancun[i*8+ia];
huancun[ia]<<=1;
if(huancun[ia+1]&0x80)
huancun[ia]++;
huancun[ia]<<=1;

楼上则正解
做单片机的话, 还是必须要了解一下其存储结构, 最起码得知道data idata xdata所指的存储区域
idata 指向的片内ram ,大小范围为256字节,所以你一个数组定义在idata段内,不能超过256字节,超过就会报错。
xdata指向的片外ram,大小范围为64KB,你可以将你需要的大容量数组定义在该段内。
参考技术A 把它缓存到xdata去试试。
unsigned char xdata huancun[320];

C语言,提取数组数据,计算得32位的结果。(keil,读SD卡时,遇到的问题)

sdbuf[]=42,4D,50,20
想得到结果:0x20504D42
【曾用:
file=(sdbuf[3]<<24)+(sdbuf[2]<<16)+(sdbuf[1]<<8)+(sdbuf[0]<<0);( file定义32位)
却得到结果:0x00004D42】
【感谢回答,追问没成功,就补充问题吧】
sdbuf[]原为512字节,是从SD卡读取的数据,想得到结果0x20504D42,用来比较、计算。譬如这里的42 4D 50 20就是图片格式(BMP)。

参考技术A sdbuff是unsigned char 还是unsigned short
一般应该用前者
sdbuf[3]在左移的时候已经溢出了,所以是0,去看c语言,关于类型转换部分。
先把sdbuf[3]赋值到 file再移位。
file = sdbuf[3];
file<<=8;
file |=sdbuf[2];
file <<=8;
file |= sdbuf[1];如此反复才行
参考技术B 这个是典型的大端模式和小端模式的转换,如果是51的单片机,你只能自行修改,
file = sdbuf[3];
file = file<<8+sdbuf[2];
file = file<<8+sdbuf[1];
file = file<<8+sdbuf[0];
如果你用的是ARM,那就不用转换了,因为ARM也是小端模式的,直接就可以使用了。追问

多谢两位。
file = sdbuf[0x2A];
file = (file<<8)+sdbuf[0x29];
file = (file<<8)+sdbuf[0x28]; //文件类型

刚做完,16进制转字符串,所以现在回复,答案很满意。

本回答被提问者采纳
参考技术C 你可以在sdbuf[]赋值时,这样写,0x42,0x4D,0x50,0x42,去试试。追问

首先感谢你的回答,不过这里的sdbuf[]原为512字节,并非随便改变的数据,是从SD卡提取的,目标是:对提取42 4D 50 20,转化为32位后,用来比较、计算。譬如,这里的数据是图片格式(BMP )。

追答

你直接写成0x424D5042这样可以吗?

追问

不可以。这是变量。

参考技术D 同上

以上是关于Keil C程序中定义的一维数组字节过大该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中定义二维数组long a[3][5],则数组占多少字节的存储空间?

c语言中整型的一维数组中每个元素地址的长度为啥会是4个字节??

C程中如何计算数组(一维及二维)占内存空间的大小

【嵌入式C】在Keil中结构体的字节对齐

什么是一维数组

用C语言实现一维数组中删除第N个元素的程序怎么写