搜索
bottom↓
回复: 27

求助:数组作为函数参数,在函数中清空数组失败。

[复制链接]

出0入27汤圆

发表于 2020-4-25 00:02:18 | 显示全部楼层 |阅读模式
清空数组数据的子程序:
  1. void SYS_WS2812ClearPixels(ws2812pixel_t *fstp_PixelList)
  2. {
  3.     uint16_t u16_i;

  4.     for (u16_i = 0; u16_i < WS2812_NUMBER; u16_i++)  /* 更新所有像素 */
  5.     {
  6.         fstp_PixelList[u16_i] = PIXEL_OFF;
  7.     }
  8. }
复制代码



调用:
  1. SYS_WS2812ClearPixels(gst_BasePixels);
复制代码

然后,发现根本不能清零这个数组,请熟悉C指针的大佬指点。

出0入0汤圆

发表于 2020-4-25 00:17:42 | 显示全部楼层
本帖最后由 luobote55 于 2020-4-25 00:19 编辑

调用前看下sizeof(gst_BasePixels)是否对。
调用后看下gst_BasePixels数组尾部几个是否PIXEL_OFF。
WS2812_NUMBER的值是多少,是否导致u16_i 溢出。

出0入27汤圆

 楼主| 发表于 2020-4-25 00:32:22 来自手机 | 显示全部楼层
luobote55 发表于 2020-4-25 00:17
调用前看下sizeof(gst_BasePixels)是否对。
调用后看下gst_BasePixels数组尾部几个是否PIXEL_OFF。
WS2812_ ...

应该不是这个问题,我把代码移到主程序里面直接操作数组,是ok的。

出0入442汤圆

发表于 2020-4-25 01:02:41 | 显示全部楼层
neutronlmk 发表于 2020-4-25 00:32
应该不是这个问题,我把代码移到主程序里面直接操作数组,是ok的。

那就是编译器的优化问题了。你直接在主函数里调memset就可以了。不需要写函数。

出0入4汤圆

发表于 2020-4-25 10:14:21 | 显示全部楼层
相关代码都发上来看看

出0入0汤圆

发表于 2020-4-25 12:27:52 | 显示全部楼层
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);

出0入57汤圆

发表于 2020-4-25 12:32:11 | 显示全部楼层
如果gst_BasePixels定义的是数组,那么SYS_WS2812ClearPixels(&gst_BasePixels)不要在前面加&,数组名本身就是地址。

出0入0汤圆

发表于 2020-4-25 13:13:11 | 显示全部楼层
这一点代码没办法判断的,相关的代码都放上来。

出0入0汤圆

发表于 2020-4-25 13:15:06 | 显示全部楼层
形参用双指针,然后传入数组地址

出0入0汤圆

发表于 2020-4-25 13:28:36 | 显示全部楼层
梨花 发表于 2020-4-25 13:15
形参用双指针,然后传入数组地址

应该是这个问题,正解来了。

出0入0汤圆

发表于 2020-4-25 21:44:47 来自手机 | 显示全部楼层
函数看起来没有问题,我经常这么写,肯定是你地址传错了

出0入0汤圆

发表于 2020-4-26 09:01:28 | 显示全部楼层
梨花 发表于 2020-4-25 13:15
形参用双指针,然后传入数组地址

搜索了下双指针有点迷糊,这个双指针是指向指针的指针,还是遍历利数组用的那种头尾指针?

按理说楼主程序写法是没有问题的,感觉像是函数里有局部变量重名了,所有清零了作用域最近的局部变量?

出0入27汤圆

 楼主| 发表于 2020-4-26 11:04:14 | 显示全部楼层
liansh2002 发表于 2020-4-26 09:01
搜索了下双指针有点迷糊,这个双指针是指向指针的指针,还是遍历利数组用的那种头尾指针?

按理说楼主程 ...

我也是有点搞不懂,之前在群里指定用过一次,现在还是比较迷糊。
已经放弃我搂主位的做法。
这个清buffei的程序不写这里了。

出0入0汤圆

发表于 2020-4-26 11:30:32 | 显示全部楼层
liansh2002 发表于 2020-4-26 09:01
搜索了下双指针有点迷糊,这个双指针是指向指针的指针,还是遍历利数组用的那种头尾指针?

按理说楼主程 ...

我的回复有误,只改变数组的内容,单指针就可以了

出190入0汤圆

发表于 2020-4-26 12:09:34 | 显示全部楼层
这么写没问题,但是,在使用这个数组的地方被优化掉了,你可以将全局数组用volatile修饰看看

出30入54汤圆

发表于 2020-4-26 14:40:36 | 显示全部楼层
ws2812pixel_t 是啥,PIXEL_OFF又是啥

出30入54汤圆

发表于 2020-4-26 14:42:07 | 显示全部楼层
knight_sh 发表于 2020-4-26 12:09
这么写没问题,但是,在使用这个数组的地方被优化掉了,你可以将全局数组用volatile修饰看看 ...

楼主的这个写法,100%编译器不会优化

出0入0汤圆

发表于 2020-4-26 15:20:04 | 显示全部楼层
knight_sh 发表于 2020-4-26 12:09
这么写没问题,但是,在使用这个数组的地方被优化掉了,你可以将全局数组用volatile修饰看看 ...

被优化的可能性很大,除了被优化我也想不到其它问题

出0入0汤圆

发表于 2020-4-26 16:02:23 | 显示全部楼层
楼主相关代码贴出来,看到了这个问题又没找到原因,心里不舒服。

出30入54汤圆

发表于 2020-4-26 18:20:57 | 显示全部楼层
Maurice 发表于 2020-4-26 15:20
被优化的可能性很大,除了被优化我也想不到其它问题

极大的概率是指针传进来就是错的
这种问题,汇编一看就明白了

出0入27汤圆

 楼主| 发表于 2020-4-27 16:22:13 | 显示全部楼层
lsx007 发表于 2020-4-26 16:02
楼主相关代码贴出来,看到了这个问题又没找到原因,心里不舒服。

按道理是没错了,怀疑是程序优化的问题。
反正我不考虑了,不封装。

出0入0汤圆

发表于 2020-4-27 17:41:50 | 显示全部楼层
看汇编吧。最直接。

出0入0汤圆

发表于 2020-4-27 19:56:28 来自手机 | 显示全部楼层
neutronlmk 发表于 2020-4-27 16:22
按道理是没错了,怀疑是程序优化的问题。
反正我不考虑了,不封装。

这不是学习的态度,我百分之百肯定是你的低级错误导致的,比如传错了地址。你这个函数本身没问题的。你如果不找到问题,你以后很难进步了,因为这是最基本的操作了

出0入0汤圆

发表于 2020-4-27 19:58:54 来自手机 | 显示全部楼层
没有调试器,总可以想办法打印一下地址和变量看看吧?或者显示到LCD,如果有的话。我面试别人时经常问对方怎么调试的。

出0入12汤圆

发表于 2020-4-27 21:04:59 | 显示全部楼层
函数里加个指针,看看地址

出0入27汤圆

 楼主| 发表于 2020-4-28 14:03:45 | 显示全部楼层
搞清楚了!
按楼主位的写法清空数组是没有问题的。
我这次出现bug的原因是——我这个数据设在xdata区,默认建工程的startup启动文件并没有把xdata清零,而我的应用是默认以为清零了,在没有人工清零之前就使用了这个数据,所以导致上电时刻这个数组数据随机。

出0入0汤圆

发表于 2020-4-29 09:03:24 | 显示全部楼层
cloudboy 发表于 2020-4-26 18:20
极大的概率是指针传进来就是错的
这种问题,汇编一看就明白了

嗯,我也怀疑是这样

出0入0汤圆

发表于 2020-4-29 09:05:17 | 显示全部楼层
neutronlmk 发表于 2020-4-28 14:03
搞清楚了!
按楼主位的写法清空数组是没有问题的。
我这次出现bug的原因是——我这个数据设在xdata区,默认 ...

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

本版积分规则

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

GMT+8, 2024-4-29 18:59

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

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