免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: vivian2086
打印 上一主题 下一主题

[C] 有人用goto 处理错误么 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2011-03-08 19:15 |只看该作者
用复杂的逻辑还不如用goto

论坛徽章:
0
32 [报告]
发表于 2011-03-08 20:44 |只看该作者
要不你分成两个函数
nizvoo 发表于 2011-03-08 18:19


foo()里内存泄漏啦,呵呵

论坛徽章:
0
33 [报告]
发表于 2011-03-08 21:54 |只看该作者
用c++的飘过

现在都喜欢用智能指针

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
34 [报告]
发表于 2011-03-09 01:09 |只看该作者
foo()里内存泄漏啦,呵呵
csern 发表于 2011-03-08 20:44



    是啊,給改了下。

论坛徽章:
0
35 [报告]
发表于 2011-03-11 09:00 |只看该作者
到处都是goto处理错误吧…………

论坛徽章:
0
36 [报告]
发表于 2011-03-11 09:09 |只看该作者
oracle  pro*c 中最近经常用到的路过

论坛徽章:
0
37 [报告]
发表于 2011-03-14 12:00 |只看该作者
不用goto并且效率没问题就不用,否则就使用goto

论坛徽章:
0
38 [报告]
发表于 2011-03-14 16:13 |只看该作者
用,不过用了GOTO的情况下其实也可以拆分函数,简化写法。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
39 [报告]
发表于 2011-03-14 19:13 |只看该作者
疯狂用 goto:

int sysinfo::build_chain(pix_fmt* fmt, chain* ptr){
    list<format_conv_t *> temp;
    list<format_conv_t *>* plist = &ptr->converter;
    list<pix_fmt *>::iterator it1;
    list<format_conv_t *>::iterator it2;

LABEL1:
    for(it1 = sflist.begin(); it1 != sflist.end(); ++it1){
        pix_fmt* p = *it1;
        if(pix_fmt_equal(p, fmt)){
            for(it2 = plist->begin(); it2 != plist->end(); ++it2){
                conv_list.push_back(*it2);
            }

            for(it2 = temp.begin(); it2 != temp.end(); ++it2){
                conv_list.push_back(*it2);
            }
            return 0;
        }
    }

LABEL2:
    for(it2 = conv_list.begin(); it2 != conv_list.end(); ++it2){
        pix_fmt* p = &((*it2)->in);
        if(pix_fmt_equal(p, fmt)){
            fmt = &((*it2)->out);
            plist->push_back(*it2);
            conv_list.erase(it2);
            goto LABEL1;
        }
    }

    if(plist->empty()){
        if(temp.empty()){
            return -1;
        }
        return build_gdi_chain(fmt, ptr, &temp);
    }
   
    format_conv_t* conv = plist->back();
    if(pix_fmt_equal(fmt, sf_gdi) || accept(fmt, &temp)){
        temp.push_back(conv);
    }

    fmt = &conv->in;
    plist->pop_back();
    goto LABEL2;
}



stream_buffer* sysinfo::pts_buffer_pop(){
    int ms;
LABEL1:
    EnterCriticalSection(&cse);

    if(pts_list.empty()){
        ms = INFINITE;
LABEL2:
        ResetEvent(hevent);
        LeaveCriticalSection(&cse);
        DWORD err = WaitForSingleObject(hevent, ms);
        if(err == WAIT_FAILED){
            return NULL;
        }
        goto LABEL1;
    }

    stream_buffer* buffer = pts_list.front();
    DWORD pts = (DWORD) (buffer->media.pts & 0xffffffff);
    DWORD tick = timeGetTime();
    if(pts > tick){
        ms = pts - tick;
        goto LABEL2;
    }

    my_pop_heap(pts_list.begin(), pts_list.end());
    assert(pts_list.back() == buffer);
    pts_list.pop_back();
    LeaveCriticalSection(&cse);

    buffer->next = NULL;
    return buffer;
}

论坛徽章:
0
40 [报告]
发表于 2011-03-14 19:40 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP