打印

十万火急!keilc51 的一个不可修改的左值问题。

[复制链接]
3394|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linfuchi|  楼主 | 2010-1-19 14:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人是菜鸟,请多多指教。
我定义了一个结构体
typedef struct
{
char name[12];
uint min;
uint max;
uint value;
}PARAM;
定义了一个结构体数组
PARAM code g_allparam[]=
{
{"th-n",0,250,1},
{"c1-F",-1,1,1},
{"c1-1",0,9999,500},
{"c1-2",0,250,0},
{"c2-F",-1,1,1},
{"c2-1",0,9999,100},
{"c2-2",0,250,0},
{"c3-F",-1,1,1},
{"c3-1",0,9999,1000},
{"c3-2",0,250,0},
{"c4-F",-2,2,-1},
{"c4-1",0,9999,58},
{"c4-2",0,250,0},
{"sh-2",1,4,0},
{"FL-1",1,100,100},
{"ALLn",0,1,0},
{"OFFS",-100,1000,0},
{"bPS",0,5,2},
{"CH-1",1,22,1},
{"SP-1",0,3,0},
{"A1-0",-1990,9999,1000},
{"A1-1",-1999,9999,1000},
{"U1-1",-1999,9999,1000},
{"U1-2",-1999,9999,1000},
{"yn",0,2,2},
{"U1-3",1000,2800,2800},
{"U1-4",0,1000,1000},
{"bb-1",0,50,25},
{"E1-H",1000,9999,1000},
{"E1-L",-1999,5000,0},
};

void setparam(E_SEQ seq,bool upordown)
{
bool bchg =false;
if(upordown)
{
  if(g_allparam[seq].value<g_allparam[seq].max)
  {
   g_allparam[seq].value++;  编译时此处出现unmodifiable lvalue,为什么??
   bchg =true;
  }
}
else
{
  if(g_allparam[seq].value<g_allparam[seq].min)
  {
   g_allparam[seq].value--;
   bchg =true;
  }  
}
if(bchg)
{}                       //设置到仪器上   I2C模块
}

相关帖子

沙发
liang7143| | 2010-1-19 14:26 | 只看该作者
PARAM code g_allparam[]=
{……}

把中间的code去掉

使用特权

评论回复
板凳
linfuchi|  楼主 | 2010-1-19 15:35 | 只看该作者
恩,我在VC6上,字符数组的初始化用{}括起来,这个接口的编译OK了。如果不加CODE,那么这些东西是不是放在数据存储器里啊?如果是,是不是就不能用small存储器模式吧,那是不是会使速度变慢?我是菜鸟,说错勿发笑。

使用特权

评论回复
地板
杨工| | 2010-1-19 16:46 | 只看该作者
2楼正解,code表示把数组放在代码段里,即放在程序FLASH里。当然不能赋值了。
放在外扩RAM里,如你所说,速度会慢,但并不是最致命的。
这么大的数组也只能放在代码段里,因为考虑成本等因素,一般尽量不会外扩RAM。
可能你是软件出身,没考虑到51单片机的特点,RAM一般256字节。
解决办法只能是你自己修改软件方案,再也不能象在PC机上那样大手大脚。

使用特权

评论回复
5
linfuchi|  楼主 | 2010-1-19 17:01 | 只看该作者
我不是软件出身,我今年刚毕业。谢谢您了,说的很好,我上个帖是单片机做LED菜单,你能去看看吗,帮我提点意见,我的这个方法应该不行。我对单片机的资源不清楚,我都不知道能不能跑起来。拜托了!!

使用特权

评论回复
6
冷漠| | 2010-1-19 20:30 | 只看该作者
uint idata value[ ]={1,1,500,0,1};

typedef struct
{
char name[12];
uint min;
uint max;
uint *ptr;
}PARAM;

PARAM  code  g_allparam[]=
{
{"th-n",0,250,value},
{"c1-F",-1,1,value},
{"c1-1",0,9999,value},
{"c1-2",0,250,value},
{"c2-F",-1,1,value}
};

void setparam(E_SEQ seq, bool upordown )
{
bool bchg =false;
if(upordown)
{
  if(g_allparam[seq].ptr[seq]<g_allparam[seq].max)
  {
   g_allparam[seq].ptr[seq]++;  
      bchg =true;
  }
}
else
{
  if(g_allparam[seq].ptr[seq]<g_allparam[seq].min)
  {
   g_allparam[seq].ptr[seq]--;
   bchg =true;
  }  
}
if(bchg)
{}                       //ÉèÖõ½ÒÇÆ÷ÉÏ   I2CÄ£¿é
}

使用特权

评论回复
7
linfuchi|  楼主 | 2010-1-20 08:11 | 只看该作者
谢谢了,不过不能给分了,呵呵,因为这个问题跟这帖关系。。。。去看看我的帖,单片机做LED菜单吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

474

帖子

1

粉丝