读书人

测测您是否细心,一段蒙了2个老板的代

发布时间: 2012-09-24 13:49:42 作者: rapoo

测测你是否细心,一段蒙了2个老板的代码^_^
嗯,先别看回贴,你看得出bug在哪吗?呵呵,一个小小的bug导致我加班一晚上没找出来,
2个老板亲自找也没找着bug在哪哦^_^

C/C++ code
#include <stdio.h>/* * 功能说明:解析NMEA语句中的GPGSA语句,提取第2,15,16,17个字段。 * 字段以','分开,并且字段有可能为空。 */static char *gsa = "$GPGSA,A,3,19,28,14,18,27,22,31,39,,,,,1.7,1.0,1.3*34";int main(int argc,char* argv[]){    int field = 0;    int i;    int loc;    float pdop,hdop,vdop;    for(i = 0; (gsa[i] != 0) && (gsa[i]!='*'); i++){/* '*' 或空格为结束符 */        if(gsa[i]==',') field++;/*当前字段*/        switch(field){            case 2:                sscanf(gsa + i + 1, "%d", &loc);/*从','下一字符开始sscanf*/                break;            case 15:                sscanf(gsa + i + 1, "%f", &pdop);                break;            case 16:                sscanf(gsa + i + 1, "%f", &hdop);                break;            case 17:                sscanf(gsa + i + 1, "%f", &vdop);                break;            default:                break;        }    }    printf("loc = %d, pdop = %2.1f, hdop = %2.1f, vdop = %2.1f\n",            loc, pdop, hdop, vdop);    return 0;}


[解决办法]
这充分说明,
闭门造车是不好的,如果你的source open一些,bug很快就可以找到,设计也可以改进~

C/C++ code
#include <stdio.h>#include <string.h>/* * 功能说明:解析NMEA语句中的GPGSA语句,提取第2,15,16,17个字段。 * 字段以','分开,并且字段有可能为空。 */static char *gsa = "$GPGSA,A,3,19,28,14,18,27,22,31,39,,,,,1.7,1.0,1.3*34";int main(int argc,char* argv[]){    int field = 0;    int i;    int loc;    float pdop,hdop,vdop;    /********************  BETTER SOLUTION */#define MAX_GSA 256    char *iter = gsa;    for(iter = strchr(iter, ','); iter; iter = strchr(iter, ',')) {        if (*iter)            ++iter;        ++field;        if (field == 2)            sscanf(iter, "%d", &loc);        if (field == 15)            sscanf(iter, "%f", &pdop);        if (field == 16)            sscanf(iter, "%f", &hdop);        if (field == 17)            sscanf(iter, "%f", &vdop);    }    printf("loc = %d, pdop = %2.1f, hdop = %2.1f, vdop = %2.1f\n",           loc, pdop, hdop, vdop);    /********************  BETTER SOLUTION */        for(i = 0; (gsa[i] != 0) && (gsa[i]!='*'); i++){/* '*' 或空格为结束符 */        if (gsa[i]==',')            field++;/*当前字段*/        switch(field){            case 2:                sscanf(gsa + i + 1, "%d", &loc);/*从','下一字符开始sscanf*/                break;            case 15:                printf(gsa + i + 1);            /*这两句可以帮忙发现bug*/                printf("---field: %d\n", field); /*同一field不该多次出现*/                sscanf(gsa + i + 1, "%f", &pdop);                while (gsa[i+1] && gsa[i+1] != ',') /*hack fix*/                    ++i;                break;            case 16:                printf(gsa + i + 1);                printf("---field: %d\n", field);                sscanf(gsa + i + 1, "%f", &hdop);                while (gsa[i+1] && gsa[i+1] != ',')                    ++i;                break;            case 17:                printf(gsa + i + 1);                printf("---field: %d\n", field);                sscanf(gsa + i + 1, "%f", &vdop);                while (gsa[i+1] && gsa[i+1] != ',')                    ++i;                break;            default:                break;        }    }    printf("loc = %d, pdop = %2.1f, hdop = %2.1f, vdop = %2.1f\n",            loc, pdop, hdop, vdop);        return 0;}
[解决办法]
不知道楼主有没用单步调试? 发现问题应该不难~~

当然,当局者迷,有时候就会这样,一个很小的问题,花了很久找出来,然后回头笑自己,:)


至于*,个人认为strchr,strtok等都能定位,自己写循环确实一定程度增加了Bug产生的几率,呵呵
[解决办法]

C/C++ code
        case 2:            {                sscanf(gsa + i + 1, "%d", &loc);/*从','下一字符开始sscanf*/                printf("%d\n", loc);                break;            }        case 15:            {                sscanf(gsa + i + 1, "%f", &pdop);                printf("%2.1f\n", pdop);                break;            }
[解决办法]
探讨
现在提取出来的这段代码就很容易进行单步调试呀,^_^

我的意思是,当定位到问题发生在某个局部内,或者某个函数,完全可以简单移植到PC中,进行单步调试,效率相对而言会高很多吧~

读书人网 >C++

热点推荐