这个函数逻辑上是不是有问题?

id27145 2011-06-14 06:38:34

// 函数本意应该是找出 data 中出现次数最多的值给 bg,出现第二多的值给 fg
// 如 data[] = { 1, 2, 3, 4, 1, 1, 2 } --> bg = 1, fg = 2

int func_1(BYTE* data, int w, int h, BYTE* bg, BYTE* fg)
{
int tileType = 0;
BYTE pix1 = *data, pix2 = 0;
int count1 = 0, count2 = 0;
BYTE end = data + w*h;

for (BYTE* ptr = data; ptr < end; ptr++)
{
if (*ptr == pix1)
{ // 这里在 loop 1 时恒成立
count1++;
continue;
}

if (count2 == 0)
{ // 这里成立时,表示碰到第一个不同的值(与data[0]值不同的第一个值)
tileType |= 0x01; // 含有两种以上的值
pix2 = *ptr; // 这里把第一个不同的值赋于 pix2
}

if (*data == pix2)
{ // 所以这里第一次执行时,恒不成立,count2不会变
count2++;
continue;
}

tileType |= 0x02;
break; // 接下来就 break 了,count2 恒为0
}

if (count1 >= count2)
{
*bg = pix1; *fg = pix2;
}
else
{
*bg = pix2; *fg = pix1;
}

return tileType;
}


count2 恒为0的话,这个函数岂不是失去意义?
...全文
121 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
id27145 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 healer_kx 的回复:]
逻辑是不是有问题要看需求是什么
[/Quote]
抛开需求,只看代码,
            count2++;
continue;
这两句永远不会被执行,岂不是说明代码自身就有问题?

[Quote=引用 3 楼 hustlaofan 的回复:]
还有一个问题,这样得到的两个值不一定是出现最多的和第二多的
可以搞个哈希表来存相应数出现的次数,在来两次冒泡就出来最大和第二大的了
[/Quote]
从调用这个函数的上下文来看是应该实现“取第一第二多”的,但从函数本身的实现来看,我也没明白它到底要做什么。不然也不至于怀疑它的逻辑有问题了。

hustlaofan 2011-06-15
  • 打赏
  • 举报
回复
就是计算数组一个数和第一个不同于第一个数出现的次数,那个不会执行的是个错误,我不是改了吗
sunlin7 2011-06-14
  • 打赏
  • 举报
回复
楼主列出的代码应该是有问题的。试用
data[] = {0, 1, 2, 3, 2, 2, 1, 1, 1}
试验
hustlaofan 2011-06-14
  • 打赏
  • 举报
回复
还有一个问题,这样得到的两个值不一定是出现最多的和第二多的
可以搞个哈希表来存相应数出现的次数,在来两次冒泡就出来最大和第二大的了
hustlaofan 2011-06-14
  • 打赏
  • 举报
回复

if (count2 == 0)
{ // 这里成立时,表示碰到第一个不同的值(与data[0]值不同的第一个值)
tileType |= 0x01; // 含有两种以上的值
pix2 = *ptr;
}

if (*ptr == pix2)
{ // 所以这里第一次执行时,恒不成立,count2不会变
count2++;
continue;
}
healer_kx 2011-06-14
  • 打赏
  • 举报
回复
逻辑是不是有问题要看需求是什么

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧