xxx的纠错(1)

呐,原来的代码

int LsitFind(SeqList *L, int x) {
    int i;
    for (i = 0; i < 5; i++) {
        if (x == L->list[i])
            return i;
        else
            return -1;
    }
}
int main() {
    SeqList *list1;
    int i, b;
    for (i = 0; i < 5; i++)
        scanf("%d", &list1->list[i]);
    b = LsitFind(list1, 3);
    printf("%d", b);
    return 0;
}

错误分析:
这里写图片描述
错误提示说:Run-Time Check Failure #3 - The variable 'list1' is being used without being initialized.
这句话表明list1未初始化
调试程序:
这里写图片描述
可以看到因为没有初始化list,导致无法读取其中的数据。
那是不是将它初始化就好了呢?
现在将其初始化:

list1->list[0] = { 0 };//初始化

调试结果:
这里写图片描述
还是同样的问题,问号表示无法读取内存
其实那样初始化是有问题的,但是是不是想着可以这样

    SeqList *list1 = NULL;

是不是就好了呢?
再调试,然而:
这里写图片描述
这样的确初始化了,但是出现这种情况,原因不知。
虽然之前的数组可以这样写:

int arr[10]={0};//开辟空间并初始化
int *a=arr;//a指向arr的首地址

但这里是数组,对于结构体是不行的。
需要手动为结构体分配内存空间

    list1 =(SeqList*) malloc(sizeof(SeqList));
    //list1就是分配的内存的首地址,分配的长度为SeqList类型个长度
    //函数void malloc(int length)是用来分配空间的,在stdlib.h头文件中
    //而且要把`void`类型强制转换为`SeqList*` 类型

现在再来调试:
这里写图片描述
呀,对了把,但是,结果呢?结果还是不对。
所以,再分析ListFind函数:

int LsitFind(SeqList *L, int x) {
    int i;
    for (i = 0; i < 5; i++) {//循环5次
        if (x == L->list[i])//如果x=L->list[i]
            return i;//返回下标
        else//如果不等
            return -1;//则返回-1
    }
}
假设输入的是12345
现在来分析:
第一次循环:比较x和L->list[i],相等吗?不相等,调到else
          返回-1//注意一旦返回,后边的所有内容都不会执行了,包括后边的循环
          所以,只要第一个数不是3,永远返回-1.
          那你是不是会想,第一个数如果是3呢?
          第一次比较,相等,进入if语句,返回i,此时是第一次循环,i=0;所以只会返回0

那么怎么改呢?
只需要这样:

int LsitFind(SeqList *L, int x) {
    int i;
    for (i = 0; i < 5; i++) {//循环5次,没问题
        if (x == L->list[i])//如果x=L->list[i]
            return i;//返回下标,后面的不管有多少代码,都不会执行了
            //如果不相等,就什么也不做,继续下一次循环!
    }
    //那么什么时候会执行到这里呢?就是直到循环结束也没有x和L->list[i],进不到if语句,就返回不了
//既然循环都结束了,没有找到,当然是返回-1啦,所以在循环外边返回-1
    return -1;
}

再来看运行结果:
这里写图片描述
这下对了吧,值为3的下标为2,没问题了。

在进行纠错优化之前,需要先了解一下代码的功能和意图。根据代码的命名和注释,可以得知代码的功能是识别游戏截图中的某些色块,并返回其位置信息。其中,suku参数是一个元组,包含了需要识别的色块信息,loadjietu参数则是需要识别的游戏截图。代码的主要流程如下: 1. 将suku中的色块信息拆分成一个个小块。 2. 针对每个小块,将其拆分成颜色和坐标信息,然后计算其在截图中的实际颜色。 3. 判断截图中该位置的颜色和目标颜色的差异是否小于20,如果是,则说明该位置是目标色块的一部分。 4. 遍历完所有的小块后,如果所有的小块都被识别出来了,则返回True和最后一个小块的位置信息,否则返回False。 根据代码的功能和流程,可以对其进行如下的优化和纠错: 1. 在判断所有小块是否被识别出来之前,需要将jjieguo的初始值设为0,而不是在每个小块循环中都将其重置为0。 2. 在计算色块颜色实际值时,需要根据色块信息中的坐标信息获取正确的像素值,而不是直接使用颜色信息。 3. 在计算色差时,需要将各个颜色通道之间的差值平方后再求和,否则得到的色差值可能会出现负数。 4. 在判断色差是否小于20时,需要使用绝对值,否则可能会出现一些不必要的错误。 最终的优化后的代码如下所示: ``` def bisefs(self, loadjietu, suku): my_list = suku[1].split(',') jjieguo = 0 for sekuai in my_list: for sek in sekuai: sekf=sek.split('|') red, green, blue = [int(sekus[4:6], 16) for sekus in sekf] xxx, yyy = [int(sekus[:3]) for sekus in sekf] yuanse = loadjietu.getpixel((xxx, yyy)) secha = math.sqrt((red - yuanse[0])**2 + (green - yuanse[1])**2 + (blue - yuanse[2])**2) if abs(secha) <= 20: jjieguo += 1 if jjieguo == len(my_list[0]): return True, xxx, yyy else: return False ``` 这样,就可以更加准确和高效地识别游戏截图中的色块了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇敢牛牛_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值