打印

PIC编译器中指针与数组的疑问与switch的疑问

[复制链接]
3504|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shuidi_wangdan|  楼主 | 2013-9-6 17:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
数组赋值给指针,编译的时候提示警告,提示suspicious pointer conversion(可疑的指针转换),请指点为什么?有没有解决的方法?

我在使用switch的时候出现一个现象,无论switch括弧的值是多少,都会随机进入case里面,例如
switch(8)
{
   case 1:break;
   case 2:break;
   case 3:break;
   case 4:break;
   case 5:break;
   default:break;
}
但是还是会随机进入case 1或2或3或4或5,有没有高手遇到过这个现象的,请给指点一下!!谢谢!
沙发
zdhlixiang2006| | 2013-9-6 18:35 | 只看该作者
你的数组是怎么赋值给指针的,给行代码看下

使用特权

评论回复
板凳
谈的元| | 2013-9-6 19:28 | 只看该作者
switch(s1)
{
   case 1:break;
   case 2:break;
   case 3:break;
   case 4:break;
   case 5:break;
   default:break;
}
这个要有一个变量呢?你写个8,代表什么意思呢?

使用特权

评论回复
地板
shuidi_wangdan|  楼主 | 2013-9-7 07:54 | 只看该作者
谈的元 发表于 2013-9-6 19:28
switch(s1)
{
   case 1:break;

我知道是变量,我修改了一个常量都可以进得去,变量也是随便进的,刚开始以为是变量的问题,修改成常量也是一样。

使用特权

评论回复
5
shuidi_wangdan|  楼主 | 2013-9-7 08:01 | 只看该作者
zdhlixiang2006 发表于 2013-9-6 18:35
你的数组是怎么赋值给指针的,给行代码看下

void show_Char( const rom far uchar *p,uchar adrPage,uchar adrColumn,uchar ZF,uchar Upside_down);
这是调用的函数,
void show_Char( “北京欢迎您”,0,0,0,0);这样提示报警!

还有下面这个函数,
void WriteHZ16(const rom far uchar *addr,uchar adrPage,uchar adrColumn,uchar ZF){              
   uchar i=0, j=0;
   uchar k;
   const rom far uchar *Dptr;
   uchar temp;
   temp=adrColumn;

   Dptr=addr;

   for(k=0;k<16;k++)
   {
       if(temp<64)
           {
               if(i==0)
                   {
                   Wright_Cmad(adrPage | 0xb8);  
               Wright_Cmad(temp | 0x40);
               i=1;
                           j=0;
                   }
                   if(ZF==0) Wright_Data(*Dptr);
                   else Wright_Data(~(*Dptr));
           Dptr++;     
           }                                                                                                                               
           else
           {
               if(j==0)
                   {
                   Wleft_Cmad(adrPage | 0xb8);  
               Wleft_Cmad((temp-64) | 0x40);
               j=1;
                           i=0;
                   }
           if(ZF==0) Wleft_Data(*Dptr);
                   else Wleft_Data(~(*Dptr));
                   Dptr++;  
        }                                                                                                                         
                temp++;
    }                        
        temp=adrColumn;
        i=0;
        j=0;
        adrPage++;

    for(k=0;k<16;k++)
    {
        if(temp<64)
            {
               if(i==0)
                   {
                   Wright_Cmad(adrPage | 0xb8);  
               Wright_Cmad(temp | 0x40);
               i=1;
                           j=0;
                   }
                   if(ZF==0) Wright_Data(*Dptr);
                   else Wright_Data(~(*Dptr));
           Dptr++;     
           }
           else
           {
               if(j==0)
                   {
                   Wleft_Cmad(adrPage | 0xb8);  
               Wleft_Cmad((temp-64) | 0x40);
               j=1;
                           i=0;
                   }
           if(ZF==0) Wleft_Data(*Dptr);
                   else Wleft_Data(~(*Dptr));
                   Dptr++;  
        }
                temp++;
    }  
}
调用如下:
void WriteHZ16(&hz[0],0,0,0);
只要是数组给指针这样赋值都提示警告!

使用特权

评论回复
6
shuidi_wangdan|  楼主 | 2013-9-7 08:58 | 只看该作者
谈的元 发表于 2013-9-6 19:28
switch(s1)
{
   case 1:break;

这种现象是在接收串口数据的时候发生的,如果不接受串口数据就不发生这个现象,我的串口接收是用中断接收,我在想是不是中断接收完了没有跳回原来地址,好疑惑,但是还有定时器中断,它倒是不影响!

使用特权

评论回复
7
shuidi_wangdan|  楼主 | 2013-9-7 09:54 | 只看该作者
C18 现场恢复是自动保护吧??

使用特权

评论回复
8
shuidi_wangdan|  楼主 | 2013-9-7 09:55 | 只看该作者
各路高手给指点一下!

使用特权

评论回复
9
李冬发| | 2013-9-7 11:58 | 只看该作者
这个应该是这类编译器的switch的一个bug吧。
强烈建议改为if() else if()

使用特权

评论回复
10
zdhlixiang2006| | 2013-9-7 12:33 | 只看该作者
shuidi_wangdan 发表于 2013-9-7 08:01
void show_Char( const rom far uchar *p,uchar adrPage,uchar adrColumn,uchar ZF,uchar Upside_down); ...

代码上没看出什么问题,你将void WriteHZ16(&hz[0],0,0,0);换成 void WriteHZ16(hz, 0, 0, 0);试一试

使用特权

评论回复
11
shuidi_wangdan|  楼主 | 2013-9-7 13:28 | 只看该作者
zdhlixiang2006 发表于 2013-9-7 12:33
代码上没看出什么问题,你将void WriteHZ16(&hz[0],0,0,0);换成 void WriteHZ16(hz, 0, 0, 0);试一试 ...

试过了,还是有警告。

使用特权

评论回复
12
shuidi_wangdan|  楼主 | 2013-9-7 13:29 | 只看该作者
李冬发 发表于 2013-9-7 11:58
这个应该是这类编译器的switch的一个bug吧。
强烈建议改为if() else if()

这个试过了,现象还是有。

使用特权

评论回复
13
shuidi_wangdan|  楼主 | 2013-9-7 13:49 | 只看该作者
本帖最后由 shuidi_wangdan 于 2013-9-7 14:03 编辑

我自己重新又新建了一个项目,发现如果电脑串口给单片机发数就有这个现象(20ms到100ms,再慢没有试过),难道是串口中断结束后现场没有恢复吗?我把文件发上来高手帮忙看一下!我找不到是哪里的原因。

11111111111111111111111111111111111111111111111.zip

45.13 KB

使用特权

评论回复
14
shuidi_wangdan|  楼主 | 2013-9-7 14:00 | 只看该作者
坛主大师帮帮忙!!!!!!!!!!!!!!

使用特权

评论回复
15
谈的元| | 2013-9-7 19:04 | 只看该作者
写完整的简化的要出现问题的代码







使用特权

评论回复
16
zdhlixiang2006| | 2013-9-7 19:35 | 只看该作者
shuidi_wangdan 发表于 2013-9-7 13:28
试过了,还是有警告。

这种方式会有警告?确实不可思议。  我在用PICC18编译器 没遇到过类似警告

使用特权

评论回复
17
shuidi_wangdan|  楼主 | 2013-9-10 14:39 | 只看该作者
纠结中!!!!!!!!!!!

使用特权

评论回复
18
shuidi_wangdan|  楼主 | 2013-9-10 14:49 | 只看该作者
谈的元 发表于 2013-9-7 19:04
写完整的简化的要出现问题的代码

这是有问题的代码

LCD.zip

158.02 KB, 阅读权限: 10

使用特权

评论回复
19
ayb_ice| | 2013-9-11 16:55 | 只看该作者
字符串指针是char*p;

使用特权

评论回复
20
shuidi_wangdan|  楼主 | 2013-9-13 08:00 | 只看该作者
ayb_ice 发表于 2013-9-11 16:55
字符串指针是char*p;

请指点,你说的不太明白?

使用特权

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

本版积分规则

个人签名:奇葩满天下,不分你我他! 奋斗!https://bbs.21ic.com/static/image/smiley/chubby/17.gif[/url]

65

主题

549

帖子

3

粉丝