OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6986|回复: 20

const的使用

[复制链接]

17

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2015-11-30
在线时间
22 小时
发表于 2019-1-4 17:15:45 | 显示全部楼层 |阅读模式
1金钱
//我想在有一个数组
const uint8_t abc[10][10];
const uint8_t 123[10][10];



//B函数
void B(const uint8_t **p)
{
    uint8_t tmp;
    tmp = p[9][9];
    p[9][9] = p[0][0];
    p[0][0] = tmp;
}
//A函数
void A(void)
{
     B(abc);
}
就是类似于这样的代码,在调用B函数的时候,就会有一个警告,说是类型强制转换了(const uint8_t [][]不能转化位 const uint8_t **)
那我就想问了,B函数定义的时候,参数类型怎么定义才能没有这个警告呢!


最佳答案

查看完整内容[请看2#楼]

不能用const类型,基本常识啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-1-4 17:15:46 | 显示全部楼层
不能用const类型,基本常识啊
回复

使用道具 举报

17

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2015-11-30
在线时间
22 小时
 楼主| 发表于 2019-1-5 16:52:58 | 显示全部楼层
正点原子 发表于 2019-1-4 17:15
不能用const类型,基本常识啊

你说的不能用const是说哪里不能用const啊,是说函数参数不能参数不能用const吗?
为什么不能用const啊?
回复

使用道具 举报

17

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2015-11-30
在线时间
22 小时
 楼主| 发表于 2019-1-5 16:59:02 | 显示全部楼层
我在驱动LCD的时候用到了一部分汉字,然后就把这一部分汉字的字模用数组存起来,为了让字模数据存在Flash中,就是用了const修饰。
然后再显示汉字的程序中,我把这个const二维数组当作指针传给函数,但是函数去访问这个数组的时候确进入了硬件中断,迷茫!
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2019-1-5 22:14:03 | 显示全部楼层
1、const 是常量,存在Flash中的,只能读取,不能写。函数B中对这个地址直接写了。
2、你所说的,字模的指针传到显示函数,应该是没问题的,你要检查一下代码。
3、uint8_t **p    这个你想表达什么意思?
回复

使用道具 举报

4

主题

36

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-1-2
在线时间
11 小时
发表于 2019-1-6 14:58:23 | 显示全部楼层
const 是常量的意思,就是   1就是1,2就是2,  改不了,,,,用const定义的东西,定义后就改不了了,小白的理解
回复

使用道具 举报

17

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2015-11-30
在线时间
22 小时
 楼主| 发表于 2019-1-7 12:09:17 | 显示全部楼层
d1z1y2 发表于 2019-1-5 22:14
1、const 是常量,存在Flash中的,只能读取,不能写。函数B中对这个地址直接写了。
2、你所说的,字模的指 ...

你所说的1和2我都理解了
回复

使用道具 举报

17

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2015-11-30
在线时间
22 小时
 楼主| 发表于 2019-1-7 12:21:07 | 显示全部楼层
d1z1y2 发表于 2019-1-5 22:14
1、const 是常量,存在Flash中的,只能读取,不能写。函数B中对这个地址直接写了。
2、你所说的,字模的指 ...

我把我真实遇到的问题发出来   你看看把
回复

使用道具 举报

17

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2015-11-30
在线时间
22 小时
 楼主| 发表于 2019-1-7 12:25:33 | 显示全部楼层
d1z1y2 发表于 2019-1-5 22:14
1、const 是常量,存在Flash中的,只能读取,不能写。函数B中对这个地址直接写了。
2、你所说的,字模的指 ...

int LCD_DisplayCHINESE(uint8_t x, uint8_t y, uint8_t **p, uint16_t c, uint16_t bc);//这是我的函数声明

const unsigned char M_PAGE_ITEM1[56][16]={};//这是我的字库数据

LCD_DisplayCHINESE(i*2+4, 1, M_PAGE_ITEM1, 0xFFFF, 0);//这是我的函数调用

这样编译通不过错误提示
..\Src\mze_lcd.c(288): error:  #167: argument of type "const unsigned char (*)[16]" is incompatible with parameter of type "uint8_t **"

我强制类型转换调用这个字库,编译通过,但是运行出现硬件中断
LCD_DisplayCHINESE(i*2+4, 1,(uint8_t **) M_PAGE_ITEM1, 0xFFFF, 0);//强制类型转换调用
回复

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2019-1-7 13:36:44 | 显示全部楼层
1.const不能赋值
2.abc是指向数组的指针,而不是指针的指针,用**肯定会出问题了。
回复

使用道具 举报

17

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2015-11-30
在线时间
22 小时
 楼主| 发表于 2019-1-7 15:08:00 | 显示全部楼层
lsj9383 发表于 2019-1-7 13:36
1.const不能赋值
2.abc是指向数组的指针,而不是指针的指针,用**肯定会出问题了。

那指向数组的指针在函数声明的时候用什么啊?
你向下看,看#9
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2019-1-7 22:07:28 | 显示全部楼层
本帖最后由 d1z1y2 于 2019-1-7 22:09 编辑
brave_dancing 发表于 2019-1-7 15:08
那指向数组的指针在函数声明的时候用什么啊?
你向下看,看#9

char a[10]={0};
数组名a就是数组的指针,
fucA(char * g_a)
{
  //code
}


fucB(void)
{
    fucA(a);  //或者  fucA(&a[0])


}




所以,我问你 uint8_t **p  是什么意思,你还没有反应过来
回复

使用道具 举报

17

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2015-11-30
在线时间
22 小时
 楼主| 发表于 2019-1-8 09:15:14 | 显示全部楼层
lsj9383 发表于 2019-1-7 13:36
1.const不能赋值
2.abc是指向数组的指针,而不是指针的指针,用**肯定会出问题了。

请看一下#9的新问题描述,之前的那个确实是我弄错了。
一个数组,他的数组名字是指针,那二维数组不是指针的指针那是什么?
如果不能用指针的指针,那要用什么?
回复

使用道具 举报

17

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2015-11-30
在线时间
22 小时
 楼主| 发表于 2019-1-8 09:19:26 | 显示全部楼层
d1z1y2 发表于 2019-1-7 22:07
char a[10]={0};
数组名a就是数组的指针,
fucA(char * g_a)

你写的这个是一维数组,这个我知道用 char *就可以了,现在是二维数组,我想这char **就可以了,但是确实不可以。
你可以看一下#9的问题,这是我真实遇到的问题。
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2019-1-8 22:12:32 | 显示全部楼层
本帖最后由 d1z1y2 于 2019-1-8 22:13 编辑
brave_dancing 发表于 2019-1-8 09:19
你写的这个是一维数组,这个我知道用 char *就可以了,现在是二维数组,我想这char **就可以了,但是确实 ...

你确定二维数据的首地址是这么表示的?以上坛友的答案都正确的,你自己好好看看书

回复

使用道具 举报

17

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2015-11-30
在线时间
22 小时
 楼主| 发表于 2019-1-9 09:11:58 | 显示全部楼层
d1z1y2 发表于 2019-1-8 22:12
你确定二维数据的首地址是这么表示的?以上坛友的答案都正确的,你自己好好看看书

我不确定啊,我要是确定我就不问了。我要是身边有书看我还来论坛干嘛,现在已经没在学校了。
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2019-1-9 09:38:45 | 显示全部楼层
不是说真的去买本书,网上电子版的多的是。你的问题的答案是什么不重要,因为随便翻哪本C语言的书都能解决。我劝你还是先放平心态,这种态度不是来解决问题的。你要是觉得我说错了,就当我放了个P就好。
回复

使用道具 举报

17

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2015-11-30
在线时间
22 小时
 楼主| 发表于 2019-1-9 11:57:57 | 显示全部楼层
wxjhby 发表于 2019-1-9 09:38
不是说真的去买本书,网上电子版的多的是。你的问题的答案是什么不重要,因为随便翻哪本C语言的书都能解决 ...

哥哥,我心态很好,我就是想要一个答案,不是找人教我怎么去找答案。我想说的是,对我来说,我就是想要一个答案而已,真的要是翻书就可以解决,我不就去了。现在我想知道,char[][];到底能不能赋值给char**p;我个人觉得能,但是编译器却出错了,我加了强制类型转换,结果运行出现硬件错误中断死机。实际问题请看#9
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2019-1-9 12:46:16 | 显示全部楼层
brave_dancing 发表于 2019-1-9 11:57
哥哥,我心态很好,我就是想要一个答案,不是找人教我怎么去找答案。我想说的是,对我来说,我就是想要一 ...

兄弟,答案都告诉你了啊,就是不能啊,原因也告诉你了啊
你搞清楚二维数组在内存中是如何存放的
回复

使用道具 举报

17

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2015-11-30
在线时间
22 小时
 楼主| 发表于 2019-1-9 13:28:12 | 显示全部楼层
d1z1y2 发表于 2019-1-9 12:46
兄弟,答案都告诉你了啊,就是不能啊,原因也告诉你了啊
你搞清楚二维数组在内存中是如何存放的

如果不能,那我要把一个二维数组当作一个参数传给一个函数该怎么做。
还有,二维数组在内存中是怎么存放的?
回复

使用道具 举报

1

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2019-3-18
在线时间
51 小时
发表于 2021-3-22 17:21:49 | 显示全部楼层
授人以鱼不如授人以渔,人家都把问题所在告诉你了,自己查一下会让自己印象深刻,直接告诉答案很快就会忘记的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 06:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表