标题: Keil报错C247,是不是数值不能直接赋予变量值 [打印本页]

作者: asdadqw2    时间: 2024-5-9 10:48
标题: Keil报错C247,是不是数值不能直接赋予变量值
keil报错,是不能直接赋予数组dat[5]={dat1,dat2,dat3,dat4,datL};这样的变量值吗?
void led_hc595_drive(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4,unsigned char datL)
{
unsigned char dat[5]={dat1,dat2,dat3,dat4,datL};
unsigned char i,j;

for(j = 0;j < 5;j++)
{
unsigned char temp = dat[j];
for(i=0;i<8;i++)
{
HC595_DS=(temp&0x80)?1:0;
HC595_SH_CP=0;
HC595_SH_CP=1;
temp<<=1;
}
}
HC595_ST_CP = 0;//上升沿 移位寄存器的数据移到存储寄存器
HC595_ST_CP = 1;


HC595_SH_CP = 0;//拉低,提高抗干扰
HC595_ST_CP = 0;
HC595_DS = 0;

}

作者: devcang    时间: 2024-5-9 12:59
unsigned char dat[5]={dat1,dat2,dat3,dat4,datL};改成定义和赋值分开
作者: lkc8210    时间: 2024-5-9 13:23
是数组不能直接用变量初始化
作者: asdadqw2    时间: 2024-5-9 13:24
devcang 发表于 2024-5-9 12:59
unsigned char dat[5]={dat1,dat2,dat3,dat4,datL};改成定义和赋值分开

把定义和赋值分开也不行
作者: xiaobendan001    时间: 2024-5-9 14:08
你这绿色背景怎么弄的啊
作者: Longan.Wang    时间: 2024-5-9 14:15
unsigned char dat[5]={dat1,dat2,dat3,dat4,datL}; 不能在函数内部这样写。
作者: lightday    时间: 2024-5-9 15:09
这样试试吧
unsigned char dat[5];
dat[0] = dat1;
dat[1] = dat2;
dat[2] = dat3;
dat[3] = dat4;
dat[4] = datL;
作者: xiaobendan001    时间: 2024-5-9 15:12
asdadqw2 发表于 2024-5-9 13:24
把定义和赋值分开也不行

要这样,dat[0] = dat1;dat[1]=……

作者: 小H丶    时间: 2024-5-9 15:47
unsigned char dat[5]={dat1,dat2,dat3,dat4,datL};
作者: 小H丶    时间: 2024-5-9 15:49
unsigned char dat[5]={0}; dat[0]=dat1;dat[1]=dat2;dat[2]=dat3;dat[3]=dat4;dat[4]=datL;
作者: Hephaestus    时间: 2024-5-9 16:20
不能这样赋值,回去看c语言教材。
作者: asdadqw2    时间: 2024-5-9 17:36
小H丶 发表于 2024-5-9 15:49
unsigned char dat[5]={0}; dat[0]=dat1;dat[1]=dat2;dat[2]=dat3;dat[3]=dat4;dat[4]=datL;

试过了,不行
作者: asdadqw2    时间: 2024-5-9 17:36
xiaobendan001 发表于 2024-5-9 14:08
你这绿色背景怎么弄的啊

不清楚
作者: asdadqw2    时间: 2024-5-9 17:37
试过这样写,还是不行
unsigned char dat[5]={0};
dat[0] = dat1;
dat[1] = dat2;
dat[2] = dat3;
dat[3] = dat4;
dat[4] = datL;
作者: Hephaestus    时间: 2024-5-9 19:10
asdadqw2 发表于 2024-5-9 17:37
试过这样写,还是不行
unsigned char dat[5]={0};
dat[0] = dat1;

报什么错?
作者: 188610329    时间: 2024-5-9 19:22
为啥要弄个数组 给自己找不痛快呢? 直接用指针不香么?

void led_hc595_drive(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4,unsigned char datL)
{
        unsigned char *p;
        unsigned char i;
       
        p        = &dat1;
        while(p <= &datL)
        {
                for(i=0;i<8;i++)
                {
                        HC595_DS=(*p&0x80)?1:0;
                        HC595_SH_CP=0;
                        HC595_SH_CP=1;
                        *p<<=1;
                }
                p++;
        }
        HC595_ST_CP = 0;//上升沿 移位寄存器的数据移到存储寄存器
        HC595_ST_CP = 1;
       
        HC595_SH_CP = 0;//拉低,提高抗干扰
        HC595_ST_CP = 0;
        HC595_DS = 0;
}
作者: yytytx    时间: 2024-5-9 19:46
看着同问题
作者: fj51hei    时间: 2024-5-9 20:49
unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4,unsigned char datL这个会自己变成连续地址?
作者: 188610329    时间: 2024-5-9 22:17
fj51hei 发表于 2024-5-9 20:49
unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4,unsigned char datL这个会 ...

你可以看一下关于传参的设定,只要传参超过3个就一定是独立的连续地址。
作者: wufa1986    时间: 2024-5-10 08:51
定义变量赋值是编译的时候完成的,所以不能赋值变量
作者: xiaobendan001    时间: 2024-5-10 10:44
asdadqw2 发表于 2024-5-9 17:37
试过这样写,还是不行
unsigned char dat[5]={0};
dat[0] = dat1;

定义要写在前边,赋值要写函数里面的吧。
main(){
dat[0] = dat1;
……
while(1);
}
作者: Longan.Wang    时间: 2024-5-10 17:37
asdadqw2 发表于 2024-5-9 17:37
试过这样写,还是不行
unsigned char dat[5]={0};
dat[0] = dat1;

可能是编译器的问题,上面写法,我用MDK就能编译通过。
把unsigned char dat[5]={0};修改成unsigned char dat[5];试试。
作者: Hephaestus    时间: 2024-5-11 22:08
Longan.Wang 发表于 2024-5-10 17:37
可能是编译器的问题,上面写法,我用MDK就能编译通过。
把unsigned char dat[5]={0};修改成unsigned cha ...

c99标准里面是可以随用随定义变量的。

c89标准变量定义必须在实体语句,比如赋值,前面才可以,有了实体语句就不能再定义变量了。

C51是永远都不可能支持c99标准了。
作者: rayin    时间: 2024-5-31 08:10
上面程序完全没必要用到数组, 如果要HC595送20个, 30个,100个unsigned char 数据怎么办, 单片机的栈空间要压爆. 要送的数据长度是可变的怎么办? c51是不支持可变数组的.

可以考虑传指针+数据长度的方法/或者就传一个unsigned char 参数, 也是能解决问题的.
作者: szqinyi    时间: 2024-5-31 09:34

这样写行
unsigned char dat[5]={0};//定义
unsigned char dat1,dat2,dat3,dat4,datL;
//下面几行在程序中运行
dat[0] = dat1;
dat[1] = dat2;
dat[2] = dat3;
dat[3] = dat4;
dat[4] = datL;
作者: 小郭郭a    时间: 2024-5-31 10:55
这种错误提示通常是因为在Keil中初始化数组时,dat1, dat2, dat3, dat4等变量的值可能无法直接获取或不符合数据类型要求。你可以尝试分别给数组dat的各个元素赋值来避免这个问题。你可以尝试使用如下方式初始化数组:  dat[0] = dat1; dat[1] = dat2; dat[2] = dat3; dat[3] = dat4; dat[4] = datL; 这通常会避免一些编译错误,希望对你有帮助!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1