我如何让continue
进入循环的顶层?我的意思是这样的:
for(;;){ // top level loop
statement1;
for(;;){ // second level loop
statement2;
if (condition1){
continue; // I expect it continue to the start of top level so it will execute statement1.
}
}
statement3;
}
字符串
这是我的真实的情况下,为什么我得到了上面的问题,基本上我的程序是发送数据与UDP套接字的数据应该发送得快。我知道UDP是不可靠的,但它的好数据是容忍与损失太多。
for (;;) { // Streaming data...
camera_fb_t* fb = esp_camera_fb_get();
size_t quotient = fb ->len / UDP_BUF_SIZE;
size_t remainder = fb ->len % UDP_BUF_SIZE;
unsigned int i = 0;
for (; i < quotient; i++) { // sending packet by packet.
if (uwc_udp_send_raw((const void*)(fb ->buf + (i * UDP_BUF_SIZE)),
UDP_BUF_SIZE) < 0) {
ESP_LOGE(uwc_tag_event, "Error in iteration: %i", i);
uwc_udp_send_raw("ERR",3); // Tell receiver there was corrupt during send data.
esp_camera_fb_return(fb);
continue; // I expect it continue to the top level
}
}
if (remainder) { // last packet to be sent if remainder exist
uwc_udp_send_raw((const void*)(fb ->buf + (i * UDP_BUF_SIZE)),
remainder);
ESP_LOGE(uwc_tag_event, "Error in last iteration!");
}
esp_camera_fb_return(fb);
}
型
5条答案
按热度按时间yqhsw0fo1#
这是一个罕见的情况下,你可以使用一个
goto
。* 鸭为封面期待火焰战争和下来票 *人们会很兴奋,说你的代码一次使用
goto
就自动不可读,并且通常会感到很苦恼。但是在这些非常罕见的情况下,最干净、最可读的代码都有一个goto
。几乎每一条规则都有例外!请记住,几乎总是有比使用
goto
更好的方法,但它的真实的问题是自由使用会很快产生“意大利面条”代码,但单独使用是合理的。字符串
人们会声称你应该设置一个布尔值和break,并坚持认为这是"更可读的“。它根本没有更可读。在编程中几乎没有教条式的法则,但“后藤总是一个必然的坏”是其中之一。这几乎是正确的。但不完全正确。
Java有一个带标签的break语句,几乎专门为
goto
提供了一种避免这种用例的方法,而没有goto
本身,因为它有一个修复程序。我认为语言上有一个微小的空白是可以理解的,但实际上这种情况非常罕见。
e3bfsja22#
您不需要
flag
或continue
或goto
:字符串
如果您需要/想要区分最后一个数据包,请添加
if( toSend < UDP_BUF_SIZE )
来记录特定的错误消息.看起来你的OP同时使用了
fb
和uwcCamFb
.我只能猜测这纠正了那个明显的错误.(感谢@Persixty提供已修复的错误报告。
ubof19bj3#
我认为后藤可以解决这个问题,我不会在正常情况下使用它,但这是可以接受的,在顶层定义一个标签,并在内部使用后藤标签:]
如果你想要一个布尔值,并在每个内部循环中检查它,或者使用后藤,这取决于你。
编辑:老实说,2个for循环并不多,也许一个简单的if条件就足够了
zpqajqem4#
你需要旗帜:
字符串
bnlyeluc5#
通过用后藤样式的无限循环替换内部无限循环,可以使代码干净地工作。从编译器的Angular 来看,消除了第二个for循环,使continue在第一个无限循环处继续。
字符串