函数更新指针变量不成功,不知道问题在哪?
全局指针变量:ws2812_pixel_t *gtp_PixelList;更新指针的函数:
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_pixel_t code switch_1_steady_on[] =
{
PIXEL_IS_RED,
PIXEL_IS_RED,
PIXEL_IS_RED,
PIXEL_IS_RED,
PIXEL_IS_RED,
PIXEL_IS_RED,
PIXEL_IS_RED,
};
函数应用:
WS2812_UpdatePixels(gtp_PixelList,switch_1_steady_on);执行上述语句之后,观察断点可以执行到ftp_PixelList = ftp_PixelNewList;
但最终switch_1_steady_on的地址并没有传递给ftp_PixelList。一下脑塞了。
请坛友帮忙看看。
另,keil中除了用print的方法,可以直接观察到指针变量指向到什么地址吗?
ftp_PixelList类型要用指针的指针,否则你这样只是给传给了指针变量的复制品指针的 2L 说的已经很明白了。
函数无法修改参数原件的内容,除非传原件的地址。在这里,需要 ws2812_pixel_t** 类型 楼上说的对,要用二级指针 使用二级指针 收到。感谢几位。 建议对指针再多了解一下,写单片机程序比较常用到 neutronlmk 发表于 2019-8-30 09:43
收到。感谢几位。
你的问题搞定了吗,楼上几位的说法让我直接懵了。 经常这样用。数组名不就是第一元素的地址啊,赋给一级指针不就是正常的吗。 另外,看到你数组定义中了‘code'关键字,能说下你的平台吗?51, ARM? xf331785508 发表于 2019-8-30 09:51
你的问题搞定了吗,楼上几位的说法让我直接懵了。 经常这样用。数组名不就是第一元素的地址啊,赋给一级 ...
指针变量做参数传到函数其实本身是值的传递,变量已经是另一个变量了。你如果只是读指针指向的内容的话,这样是没问题的,因为这个地址已经传进去了。但是你要是想向外面返回指针指向的新地址,也就是改外面那个指针内容,那么你就得知道这个指针自己的地址,所以就是指针的指针 还是没搞定.
全局变量:
ws2812_pixel_t **gtpp_PixelList;函数:
void WS2812_UpdatePixels(ws2812_pixel_t **ftpp_PixelList,ws2812_pixel_t *ftp_PixelNewList)
{
if(se_Ws2812Status == WS2812_IDLE)
{
ftpp_PixelList= &ftp_PixelNewList;
se_Ws2812Status = WS2812_SNEDING_DATA;
}
}应用:
WS2812_UpdatePixels(gtpp_PixelList,switch_1_steady_on);还是没有得到想要的结果
xf331785508 发表于 2019-8-30 09:51
你的问题搞定了吗,楼上几位的说法让我直接懵了。 经常这样用。数组名不就是第一元素的地址啊,赋给一级 ...
还没有搞定,在测试。
keil可以观察到指针指向了什么地址吗?我想用断点看一下。 *ftpp_PixelList= ftp_PixelNewList; Zphoenix 发表于 2019-8-30 10:43
还是没得到想要结果 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(>p_PixelList,switch_1_steady_on);
改这几个地方 楼上是对的,楼主应该好好学习下指针的用法 落叶知秋 发表于 2019-8-30 11:01
void WS2812_UpdatePixels(ws2812_pixel_t **ftp_PixelList,ws2812_pixel_t *ftp_PixelNewList)
{
if ...
WS2812_UpdatePixels(>p_PixelList,switch_1_steady_on);
这里编译器报错 落叶知秋 发表于 2019-8-30 11:01
void WS2812_UpdatePixels(ws2812_pixel_t **ftp_PixelList,ws2812_pixel_t *ftp_PixelNewList)
{
if ...
感谢,感谢。终于可以了。
这里足够我学习一天。 本帖最后由 neutronlmk 于 2019-8-30 11:30 编辑
我把新的代码传一下。
声明:
ws2812_pixel_t *gtp_PixelList;函数:
void WS2812_UpdatePixels(ws2812_pixel_t **ftpp_PixelList,ws2812_pixel_t *ftp_PixelNewList)
{
if(se_Ws2812Status == WS2812_IDLE)
{
*ftpp_PixelList = ftp_PixelNewList;
se_Ws2812Status = WS2812_SNEDING_DATA;
}
}数组:
ws2812_pixel_t code switch_1_steady_on[] =
{
PIXEL_IS_RED,
PIXEL_IS_RED,
PIXEL_IS_RED,
PIXEL_IS_RED,
PIXEL_IS_RED,
PIXEL_IS_RED,
PIXEL_IS_RED,
};函数应用:
WS2812_UpdatePixels(&ftp_PixelNewList,switch_1_steady_on);
neutronlmk 发表于 2019-8-30 11:29
我把新的代码传一下。
声明:
函数:
嗯。学无止境。亲自试了一把,我才明白了。 得好好复习指针的用法 neutronlmk 发表于 2019-8-30 11:29
我把新的代码传一下。
声明:
函数:
这次重发的代码,变量命名的可读性好了很多!
要弄透一个东西,非得亲手做做。纸上得来终觉浅,绝知此事要躬行。
页:
[1]