打印

“脱掉裤子放屁” 430高手请来讲解

[复制链接]
4114|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
耕在此行|  楼主 | 2009-5-18 13:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题已经解决,
    本人把const bin08*    Data_adr[100]
改成了bin08*   const  Data_adr[100]
以上为5.23修改
-----------------------------------------------------------
本人碰到一个问题,
定义一个常数指针数组,编译时却被放在RAM里了,晕啊
本人不知道怎么办了。
具体如下:
const bin08*    Data_adr[100] = // 显示数据起始地址表
    {
    &T.sec,        &T.day,        &T.year,        &F.data03[0],        &F.data04[0],        // 0 -- 4
    &F.data05[0],        &ET.PP2[1],            &ET.PP0[1],            &ET.PP1[1],            // 5 -- 8
    ......................
    };
编译结果:

相关帖子

沙发
耕在此行|  楼主 | 2009-5-18 13:58 | 只看该作者

呵呵 自己先顶顶

使用特权

评论回复
板凳
耕在此行|  楼主 | 2009-5-18 14:02 | 只看该作者

本人想如果实在不行的话就这么办:

const bin16    Data_adr[100] = // 显示数据起始地址表
    {
    (Uint)&T.sec,        (Uint)&T.day,      (Uint)&T.year,     (Uint)&F.data03[0], (Uint)&F.data04[0],        // 0 -- 4
    (Uint)&F.data05[0],  (Uint)&ET.PP2[1],  (Uint)&ET.PP0[1],  (Uint)&ET.PP1[1],      // 5 -- 8
    ......................
    };

使用特权

评论回复
地板
耕在此行|  楼主 | 2009-5-18 14:28 | 只看该作者

按上面的办法是可以的

但这个真是脱得裤子放屁,多此一举啊。
本人在开始用指针常数时就感觉不对劲,在使用时明明定义的是指针常数,但调用时偏偏需加个强制类型转换。
不知道是IAR本身的不足还是本人的不知。

使用特权

评论回复
5
mohanwei| | 2009-5-18 14:35 | 只看该作者

语法理解问题……

const bin16    Data_adr[100];//定义一个数组

至于const bin08*    Data_adr[100] = 能编译通过实在有点奇怪,可能是编译器扩展了一些语法

使用特权

评论回复
6
耕在此行|  楼主 | 2009-5-18 16:11 | 只看该作者

const bin08* Data_adr[100] =

bin08 = uchar

这个语法没错啊
定义一个常数指针数组

使用特权

评论回复
7
林粼粼| | 2009-5-18 17:37 | 只看该作者

IAR里用关键字 flash 来指向rom

const和rom可不是等价的

使用特权

评论回复
8
刘前辈| | 2009-5-18 17:53 | 只看该作者

const 不是存储类型修饰符。

修改:
code  bin08*    Data_adr[100] =

或者:
  bin08 *code  Data_adr[100] =

一样。

使用特权

评论回复
9
耕在此行|  楼主 | 2009-5-18 18:49 | 只看该作者

楼上的错了

KEIL里可能是这样写 IAR不行的

使用特权

评论回复
10
刘前辈| | 2009-5-18 19:01 | 只看该作者

标准ANSI C.

  bin08 *code  Data_adr[100] =
  
  bin08 *const  Data_adr[100] =

比较:
void (*const Data_adr[100])(void) ={ , , };

使用特权

评论回复
11
耕在此行|  楼主 | 2009-5-18 19:18 | 只看该作者

bin08 *code Data_adr[100] =


这个不行
 

使用特权

评论回复
12
一级菜鸟| | 2009-5-18 19:37 | 只看该作者

AVR么?

参考下:

#include <avrpgmspace.h>


const unsigned char PROGMEM China12Tab[][24]=
......

WriteLcdData(pgm_read_byte(&China12Tab[Ch][seg]));
......

使用特权

评论回复
13
耕在此行|  楼主 | 2009-5-18 19:57 | 只看该作者

是430

7楼说的也不行的

使用特权

评论回复
14
一级菜鸟| | 2009-5-18 20:22 | 只看该作者

430似乎是这样

搜索下#pragma memory=
很久不玩了

使用特权

评论回复
15
Again_gyf| | 2009-5-18 20:45 | 只看该作者

const修饰的对象问题!

建议楼主看下书搞清楚!
你这应该为const bin08 *  const  Data_adr[100]

使用特权

评论回复
16
耕在此行|  楼主 | 2009-5-18 21:41 | 只看该作者

楼上说的可能对

明天再试试

使用特权

评论回复
17
johnwjl| | 2009-5-19 16:23 | 只看该作者

用#pragma

使用特权

评论回复
18
耕在此行|  楼主 | 2009-5-20 14:08 | 只看该作者

刘前辈说的不错

    const   bin08*  Data_adr[100]= {......}
与  bin08*  const   Data_adr[100]= {......}
是不同的,本人的理解是:
    const   bin08*  Data_adr[100]= {......}是定义一个指针变量数组 但指针值不可改变.因为是变量,所以放在RAM里.
    bin08*  const   Data_adr[100]= {......}是定义一个常数指针数组,所以会放在CODE里面.

使用特权

评论回复
19
刘前辈| | 2009-5-20 20:28 | 只看该作者

夸的俺轻飘飘的。再交流点学习心得。

数组名和函数名都是一个常量指针。从另一方面理解,就是[]和()必然“左傍指针”,——[ ]/( )的左边必是一个常量指针。

根据这个原理, 数组名Data_adr本来就是一个常量指针,这是废话。关键是下面:   * Data_adr[] ; 既然Data_adr本身就是常量指针,那么前面的*号当然不是修饰数组名Data_adr的,——而是修饰“数组元素”的。

这样好理解了:这是一个100个元素为指向bin08的指针数组。

要使这个数组所有元素分配在code区,最关键的一点:
它的每个元素——指针/变量地址本身在不在code区!也就是:
T.sec,  T.day,   T.year,  F.data03[0],  F.data04 ......这些变量本身是不是分配在了code区。这是当然必须的。

可以想象:如果上述条件满足,编译器当然自动会把数组元素分配到code区。所以,说明可以写为:
 bin08  * Data_adr[100] ={ ,,,.....};    

指针符* 后面已经不用存储类型修饰符,编译器当然知道{ , , ,}的内容本身就是常量,肯定分配在code区的。

举例:
1、 bin08  Data_adr[ ] ={ a,b,c,d,.....};  

    a,b,c,d, 肯定分配在code区,因为他们本身就是恒定量。

2、bin08 *Data_adr[ ] ={ &a,&b,&c,&d,.....};  

也一样。



 

瞎侃,希望高手训导。




使用特权

评论回复
20
electron0101| | 2009-5-20 20:45 | 只看该作者

IAR 我也碰到这问题!

使用特权

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

本版积分规则

40

主题

1108

帖子

0

粉丝