求助:数组作为函数参数,在函数中清空数组失败。
清空数组数据的子程序:void SYS_WS2812ClearPixels(ws2812pixel_t *fstp_PixelList)
{
uint16_t u16_i;
for (u16_i = 0; u16_i < WS2812_NUMBER; u16_i++)/* 更新所有像素 */
{
fstp_PixelList = PIXEL_OFF;
}
}
调用:
SYS_WS2812ClearPixels(gst_BasePixels);
然后,发现根本不能清零这个数组,请熟悉C指针的大佬指点。
本帖最后由 luobote55 于 2020-4-25 00:19 编辑
调用前看下sizeof(gst_BasePixels)是否对。
调用后看下gst_BasePixels数组尾部几个是否PIXEL_OFF。
WS2812_NUMBER的值是多少,是否导致u16_i 溢出。 luobote55 发表于 2020-4-25 00:17
调用前看下sizeof(gst_BasePixels)是否对。
调用后看下gst_BasePixels数组尾部几个是否PIXEL_OFF。
WS2812_ ...
应该不是这个问题,我把代码移到主程序里面直接操作数组,是ok的。 neutronlmk 发表于 2020-4-25 00:32
应该不是这个问题,我把代码移到主程序里面直接操作数组,是ok的。
那就是编译器的优化问题了。你直接在主函数里调memset就可以了。不需要写函数。 相关代码都发上来看看 void SYS_WS2812ClearPixels(ws2812pixel_t *fstp_PixelList)
{
uint16_t u16_i;
for (u16_i = 0; u16_i < WS2812_NUMBER; u16_i++) /* 更新所有像素 */
{
*(fstp_PixelList+u16_i) = PIXEL_OFF;
}
}
SYS_WS2812ClearPixels(&gst_BasePixels); 如果gst_BasePixels定义的是数组,那么SYS_WS2812ClearPixels(&gst_BasePixels)不要在前面加&,数组名本身就是地址。 这一点代码没办法判断的,相关的代码都放上来。 形参用双指针,然后传入数组地址 梨花 发表于 2020-4-25 13:15
形参用双指针,然后传入数组地址
应该是这个问题,正解来了。 函数看起来没有问题,我经常这么写,肯定是你地址传错了 梨花 发表于 2020-4-25 13:15
形参用双指针,然后传入数组地址
搜索了下双指针有点迷糊,这个双指针是指向指针的指针,还是遍历利数组用的那种头尾指针?
按理说楼主程序写法是没有问题的,感觉像是函数里有局部变量重名了,所有清零了作用域最近的局部变量? liansh2002 发表于 2020-4-26 09:01
搜索了下双指针有点迷糊,这个双指针是指向指针的指针,还是遍历利数组用的那种头尾指针?
按理说楼主程 ...
我也是有点搞不懂,之前在群里指定用过一次,现在还是比较迷糊。
已经放弃我搂主位的做法。
这个清buffei的程序不写这里了。 liansh2002 发表于 2020-4-26 09:01
搜索了下双指针有点迷糊,这个双指针是指向指针的指针,还是遍历利数组用的那种头尾指针?
按理说楼主程 ...
我的回复有误,只改变数组的内容,单指针就可以了 这么写没问题,但是,在使用这个数组的地方被优化掉了,你可以将全局数组用volatile修饰看看 ws2812pixel_t 是啥,PIXEL_OFF又是啥 knight_sh 发表于 2020-4-26 12:09
这么写没问题,但是,在使用这个数组的地方被优化掉了,你可以将全局数组用volatile修饰看看 ...
楼主的这个写法,100%编译器不会优化 knight_sh 发表于 2020-4-26 12:09
这么写没问题,但是,在使用这个数组的地方被优化掉了,你可以将全局数组用volatile修饰看看 ...
被优化的可能性很大,除了被优化我也想不到其它问题 楼主相关代码贴出来,看到了这个问题又没找到原因,心里不舒服。{:dizzy:} Maurice 发表于 2020-4-26 15:20
被优化的可能性很大,除了被优化我也想不到其它问题
极大的概率是指针传进来就是错的
这种问题,汇编一看就明白了 lsx007 发表于 2020-4-26 16:02
楼主相关代码贴出来,看到了这个问题又没找到原因,心里不舒服。
按道理是没错了,怀疑是程序优化的问题。
反正我不考虑了,不封装。 看汇编吧。最直接。 neutronlmk 发表于 2020-4-27 16:22
按道理是没错了,怀疑是程序优化的问题。
反正我不考虑了,不封装。
这不是学习的态度,我百分之百肯定是你的低级错误导致的,比如传错了地址。你这个函数本身没问题的。你如果不找到问题,你以后很难进步了,因为这是最基本的操作了 没有调试器,总可以想办法打印一下地址和变量看看吧?或者显示到LCD,如果有的话。我面试别人时经常问对方怎么调试的。 函数里加个指针,看看地址
搞清楚了!
按楼主位的写法清空数组是没有问题的。
我这次出现bug的原因是——我这个数据设在xdata区,默认建工程的startup启动文件并没有把xdata清零,而我的应用是默认以为清零了,在没有人工清零之前就使用了这个数据,所以导致上电时刻这个数组数据随机。 cloudboy 发表于 2020-4-26 18:20
极大的概率是指针传进来就是错的
这种问题,汇编一看就明白了
嗯,我也怀疑是这样 neutronlmk 发表于 2020-4-28 14:03
搞清楚了!
按楼主位的写法清空数组是没有问题的。
我这次出现bug的原因是——我这个数据设在xdata区,默认 ...
找到原因就好,恭喜LZ。 另外愚人节不是已经过去了,跟大伙开这么大玩笑{:lol:}
页:
[1]