neutronlmk 发表于 2020-4-25 00:02:18

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

清空数组数据的子程序:
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:17:42

本帖最后由 luobote55 于 2020-4-25 00:19 编辑

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

neutronlmk 发表于 2020-4-25 00:32:22

luobote55 发表于 2020-4-25 00:17
调用前看下sizeof(gst_BasePixels)是否对。
调用后看下gst_BasePixels数组尾部几个是否PIXEL_OFF。
WS2812_ ...

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

wye11083 发表于 2020-4-25 01:02:41

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

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

ztrx 发表于 2020-4-25 10:14:21

相关代码都发上来看看

lyl1070 发表于 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);

leafstamen 发表于 2020-4-25 12:32:11

如果gst_BasePixels定义的是数组,那么SYS_WS2812ClearPixels(&gst_BasePixels)不要在前面加&,数组名本身就是地址。

hyghyg1234 发表于 2020-4-25 13:13:11

这一点代码没办法判断的,相关的代码都放上来。

梨花 发表于 2020-4-25 13:15:06

形参用双指针,然后传入数组地址

hyghyg1234 发表于 2020-4-25 13:28:36

梨花 发表于 2020-4-25 13:15
形参用双指针,然后传入数组地址

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

nanfang2000 发表于 2020-4-25 21:44:47

函数看起来没有问题,我经常这么写,肯定是你地址传错了

liansh2002 发表于 2020-4-26 09:01:28

梨花 发表于 2020-4-25 13:15
形参用双指针,然后传入数组地址

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

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

neutronlmk 发表于 2020-4-26 11:04:14

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

按理说楼主程 ...

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

梨花 发表于 2020-4-26 11:30:32

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

按理说楼主程 ...

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

knight_sh 发表于 2020-4-26 12:09:34

这么写没问题,但是,在使用这个数组的地方被优化掉了,你可以将全局数组用volatile修饰看看

cloudboy 发表于 2020-4-26 14:40:36

ws2812pixel_t 是啥,PIXEL_OFF又是啥

cloudboy 发表于 2020-4-26 14:42:07

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

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

Maurice 发表于 2020-4-26 15:20:04

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

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

lsx007 发表于 2020-4-26 16:02:23

楼主相关代码贴出来,看到了这个问题又没找到原因,心里不舒服。{:dizzy:}

cloudboy 发表于 2020-4-26 18:20:57

Maurice 发表于 2020-4-26 15:20
被优化的可能性很大,除了被优化我也想不到其它问题

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

neutronlmk 发表于 2020-4-27 16:22:13

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

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

lingdianhao 发表于 2020-4-27 17:41:50

看汇编吧。最直接。

nanfang2000 发表于 2020-4-27 19:56:28

neutronlmk 发表于 2020-4-27 16:22
按道理是没错了,怀疑是程序优化的问题。
反正我不考虑了,不封装。

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

nanfang2000 发表于 2020-4-27 19:58:54

没有调试器,总可以想办法打印一下地址和变量看看吧?或者显示到LCD,如果有的话。我面试别人时经常问对方怎么调试的。

waterx3 发表于 2020-4-27 21:04:59

函数里加个指针,看看地址

neutronlmk 发表于 2020-4-28 14:03:45

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

Maurice 发表于 2020-4-29 09:03:24

cloudboy 发表于 2020-4-26 18:20
极大的概率是指针传进来就是错的
这种问题,汇编一看就明白了

嗯,我也怀疑是这样

Maurice 发表于 2020-4-29 09:05:17

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

找到原因就好,恭喜LZ。 另外愚人节不是已经过去了,跟大伙开这么大玩笑{:lol:}
页: [1]
查看完整版本: 求助:数组作为函数参数,在函数中清空数组失败。