搜索
bottom↓
回复: 20

函数更新指针变量不成功,不知道问题在哪?

[复制链接]

出0入27汤圆

发表于 2019-8-29 22:54:28 | 显示全部楼层 |阅读模式
全局指针变量:
  1. ws2812_pixel_t *gtp_PixelList;
复制代码
更新指针的函数:

  1. void WS2812_UpdatePixels(ws2812_pixel_t *ftp_PixelList,ws2812_pixel_t *ftp_PixelNewList)
  2. {
  3.     if(se_Ws2812Status == WS2812_IDLE)
  4.     {
  5.         ftp_PixelList   = ftp_PixelNewList;
  6.         se_Ws2812Status = WS2812_SNEDING_DATA;
  7.     }
  8. }
复制代码
数组:
  1. ws2812_pixel_t code switch_1_steady_on[] =
  2. {
  3.     PIXEL_IS_RED,
  4.     PIXEL_IS_RED,
  5.     PIXEL_IS_RED,
  6.     PIXEL_IS_RED,
  7.     PIXEL_IS_RED,
  8.     PIXEL_IS_RED,
  9.     PIXEL_IS_RED,
  10. };
复制代码

函数应用:
  1. WS2812_UpdatePixels(gtp_PixelList,switch_1_steady_on);
复制代码
执行上述语句之后,观察断点可以执行到ftp_PixelList   = ftp_PixelNewList;
但最终switch_1_steady_on的地址并没有传递给ftp_PixelList。一下脑塞了。
请坛友帮忙看看。
另,keil中除了用print的方法,可以直接观察到指针变量指向到什么地址吗?

出0入0汤圆

发表于 2019-8-29 23:28:10 来自手机 | 显示全部楼层
ftp_PixelList类型要用指针的指针,否则你这样只是给传给了指针变量的复制品指针的

出200入2554汤圆

发表于 2019-8-30 01:25:44 | 显示全部楼层
2L 说的已经很明白了。

函数无法修改参数原件的内容,除非传原件的地址。在这里,需要 ws2812_pixel_t** 类型

出0入0汤圆

发表于 2019-8-30 03:46:52 来自手机 | 显示全部楼层
楼上说的对,要用二级指针

出0入0汤圆

发表于 2019-8-30 07:36:53 来自手机 | 显示全部楼层
使用二级指针

出0入27汤圆

 楼主| 发表于 2019-8-30 09:43:49 | 显示全部楼层
收到。感谢几位。

出40入42汤圆

发表于 2019-8-30 09:49:39 | 显示全部楼层
建议对指针再多了解一下,写单片机程序比较常用到

出0入0汤圆

发表于 2019-8-30 09:51:48 | 显示全部楼层
neutronlmk 发表于 2019-8-30 09:43
收到。感谢几位。

你的问题搞定了吗,楼上几位的说法让我直接懵了。 经常这样用。数组名不就是第一元素的地址啊,赋给一级指针不就是正常的吗。    另外,看到你数组定义中了‘code'关键字,能说下你的平台吗?51, ARM?

出0入0汤圆

发表于 2019-8-30 09:56:48 | 显示全部楼层
xf331785508 发表于 2019-8-30 09:51
你的问题搞定了吗,楼上几位的说法让我直接懵了。 经常这样用。数组名不就是第一元素的地址啊,赋给一级 ...

指针变量做参数传到函数其实本身是值的传递,变量已经是另一个变量了。你如果只是读指针指向的内容的话,这样是没问题的,因为这个地址已经传进去了。但是你要是想向外面返回指针指向的新地址,也就是改外面那个指针内容,那么你就得知道这个指针自己的地址,所以就是指针的指针

出0入27汤圆

 楼主| 发表于 2019-8-30 10:35:45 | 显示全部楼层
还是没搞定.
全局变量:
  1. ws2812_pixel_t **gtpp_PixelList;
复制代码
函数:
  1. void WS2812_UpdatePixels(ws2812_pixel_t **ftpp_PixelList,ws2812_pixel_t *ftp_PixelNewList)
  2. {
  3.     if(se_Ws2812Status == WS2812_IDLE)
  4.     {
  5.         ftpp_PixelList  = &ftp_PixelNewList;
  6.         se_Ws2812Status = WS2812_SNEDING_DATA;
  7.     }
  8. }
复制代码
应用:
  1. WS2812_UpdatePixels(gtpp_PixelList,switch_1_steady_on);
复制代码
还是没有得到想要的结果

出0入27汤圆

 楼主| 发表于 2019-8-30 10:38:14 | 显示全部楼层
xf331785508 发表于 2019-8-30 09:51
你的问题搞定了吗,楼上几位的说法让我直接懵了。 经常这样用。数组名不就是第一元素的地址啊,赋给一级 ...

还没有搞定,在测试。
keil可以观察到指针指向了什么地址吗?我想用断点看一下。

出0入0汤圆

发表于 2019-8-30 10:43:25 | 显示全部楼层
  1. *ftpp_PixelList  = ftp_PixelNewList;
复制代码

出0入27汤圆

 楼主| 发表于 2019-8-30 10:58:11 | 显示全部楼层

还是没得到想要结果

出40入42汤圆

发表于 2019-8-30 11:01:30 | 显示全部楼层
void WS2812_UpdatePixels(ws2812_pixel_t **ftp_PixelList,ws2812_pixel_t *ftp_PixelNewList)
{
    if(se_Ws2812Status == WS2812_IDLE)
    {
        *ftp_PixelList   = ftp_PixelNewList;
        se_Ws2812Status = WS2812_SNEDING_DATA;
    }
}

WS2812_UpdatePixels(&gtp_PixelList,switch_1_steady_on);

改这几个地方

出0入0汤圆

发表于 2019-8-30 11:15:03 来自手机 | 显示全部楼层
楼上是对的,楼主应该好好学习下指针的用法

出0入27汤圆

 楼主| 发表于 2019-8-30 11:23:57 | 显示全部楼层
落叶知秋 发表于 2019-8-30 11:01
void WS2812_UpdatePixels(ws2812_pixel_t **ftp_PixelList,ws2812_pixel_t *ftp_PixelNewList)
{
    if ...

WS2812_UpdatePixels(&gtp_PixelList,switch_1_steady_on);
这里编译器报错

出0入27汤圆

 楼主| 发表于 2019-8-30 11:26:13 | 显示全部楼层
落叶知秋 发表于 2019-8-30 11:01
void WS2812_UpdatePixels(ws2812_pixel_t **ftp_PixelList,ws2812_pixel_t *ftp_PixelNewList)
{
    if ...

感谢,感谢。终于可以了。
这里足够我学习一天。

出0入27汤圆

 楼主| 发表于 2019-8-30 11:29:33 | 显示全部楼层
本帖最后由 neutronlmk 于 2019-8-30 11:30 编辑

我把新的代码传一下。
声明:
  1. ws2812_pixel_t *gtp_PixelList;
复制代码
函数:
  1. void WS2812_UpdatePixels(ws2812_pixel_t **ftpp_PixelList,ws2812_pixel_t *ftp_PixelNewList)
  2. {
  3.     if(se_Ws2812Status == WS2812_IDLE)
  4.     {
  5.         *ftpp_PixelList = ftp_PixelNewList;
  6.         se_Ws2812Status = WS2812_SNEDING_DATA;
  7.     }
  8. }
复制代码
数组:
  1. ws2812_pixel_t code switch_1_steady_on[] =
  2. {
  3.     PIXEL_IS_RED,
  4.     PIXEL_IS_RED,
  5.     PIXEL_IS_RED,
  6.     PIXEL_IS_RED,
  7.     PIXEL_IS_RED,
  8.     PIXEL_IS_RED,
  9.     PIXEL_IS_RED,
  10. };
复制代码
函数应用:

  1. WS2812_UpdatePixels(&ftp_PixelNewList,switch_1_steady_on);
复制代码

出0入0汤圆

发表于 2019-8-30 14:22:22 | 显示全部楼层
neutronlmk 发表于 2019-8-30 11:29
我把新的代码传一下。
声明:
函数:


嗯。学无止境。亲自试了一把,我才明白了。

出0入0汤圆

发表于 2019-8-30 14:40:30 | 显示全部楼层
得好好复习指针的用法

出330入0汤圆

发表于 2019-8-30 14:43:30 来自手机 | 显示全部楼层
neutronlmk 发表于 2019-8-30 11:29
我把新的代码传一下。
声明:
函数:

这次重发的代码,变量命名的可读性好了很多!
要弄透一个东西,非得亲手做做。纸上得来终觉浅,绝知此事要躬行。

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 16:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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