OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2999|回复: 5

大家帮忙看下,我这个函数有问题么

[复制链接]

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-4-9 09:27:57 | 显示全部楼层 |阅读模式
void* Search_Data(void *pData, u16 size,void* searchedDat,u16 len)
{
        if(pData == NULL || size < len || searchedDat == NULL) return NULL;
        size = size - len + 1;
        while(size--)
        {
                switch(len)
                {
                        case 1: if(*(u8*)pData++ == *(u8*)searchedDat)  return  pData;break;
                        case 2: if(*(u16*)pData  == *(u16*)searchedDat)        return  pData;
                        case 4: if(*(u32*)pData  == *(u32*)searchedDat) return  pData;
                                        (u8*)pData++;
                                        break;
                }
        }
        return NULL;               
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11553
金钱
11553
注册时间
2014-4-1
在线时间
1317 小时
发表于 2016-4-9 11:30:36 | 显示全部楼层
感觉LZ自学c语言?

只看格式问题,
函数声明,void后面加*,我怎么没见过。。。
case 1内容比较多,应当加大括号,否则执行顺序就会有问题,
case 2没有加break。
最后还缺default

估计编译都通不过。

回复 支持 反对

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-4-9 11:51:09 | 显示全部楼层
本帖最后由 憨厚诚实大叔 于 2016-4-9 12:39 编辑

LZ厉害,下面的解释很不错
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
 楼主| 发表于 2016-4-9 11:54:48 | 显示全部楼层
xuande 发表于 2016-4-9 11:30
感觉LZ自学c语言?

只看格式问题,

你的C语言该好好学学了哦,老兄。      
1,之所以形参类型为void*型,是为了提高该函数的通用性,你可以传int*,char*进来都可以的。
2,这个可加可不加的啊。
3,我之所以没加break,是让它接着往下执行啊,在4里跳出啊。当然,它会将4的判断再执行一遍,这是个问题。
4,switch语句的default分支可要可不要的啊,当然加上可监控一些异常情况的产生。
5,KEIL编译确实通不过,但在GCC可以通过的。它报的错误是我不能*(u8*)pData++有问题,该成*(((u8*)pData)++)就只有警告了,如果再加一个确定的指针类型,u8* p = (u8*)pData; *p++就无警告无错误了。
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
 楼主| 发表于 2016-4-9 11:58:53 | 显示全部楼层
pthread 发表于 2016-4-9 11:54
你的C语言该好好学学了哦,老兄。      
1,之所以形参类型为void*型,是为了提高该函数的通用性,你可 ...

KEIL编译器根据ANSI标准是不能让我对void*进行自加的,即使强制类型转换了。只能通过间接办法。
回复 支持 反对

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11553
金钱
11553
注册时间
2014-4-1
在线时间
1317 小时
发表于 2016-4-9 12:54:21 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 01:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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