还有其他替代方法吗?

时间:2019-10-02 08:45:24

标签: c++

我对break指令有疑问;

实际上,在我的情况下,我在下面的计算代码示例中进行复制,我使用两个嵌套的for循环和if循环。

我希望当open_bound变量= 0时,完全退出循环并因此显示时间t的值。执行后,我看到的是时间t = 0而不是3的显示,并且我很难理解为什么。你能开导我吗?

还有其他替代方法吗? (我不能使用goto,而且我在实际代码中并行化了这部分)

提前谢谢

#include <iostream>
#include <vector>
using namespace std;
      
int main () {
    int numtracers = 1000;
    int save_t;
    double t;
     
    int open_bound = 0;
    int tau = 5;
    double int_step = 0.25;
     
    for (int i = 0; i < numtracers; i++) {
        // Variable to overwrite the successive positions of each particle
        vector <double> coord(2);
        coord[0] = 0.1;
        coord[1] = 0.2;
        int result_checkin;
        for(t=0; t<tau-1; t+=int_step) {
            save_t = t;
            // Function to check if coordinates are inside the domain well defined
            // result_checkin = check_out(coord);
            if (t == tau-2) result_checkin = 1;
            if (result_checkin == 1) { // Particle goes outside domain
                if (open_bound == 0) {  
                    break;                         
                }
                else {
                    coord[0]+=0.1;
                    coord[1]+=0.1;                     
                }
            }
            else {
                coord[0]+=0.1;
                coord[1]+=0.1;
            }
        }
    }
    cout << save_t << endl;
    return 0;
}

2 个答案:

答案 0 :(得分:2)

好的,让我们首先回顾一下break语句的作用(不算在switch块中的使用):它从最里面的for,{{ 1}}或while循环。因此,这里不考虑do ... while语句-并不是真正的 循环

因此,在您的主代码中,您实际上仅具有两个循环。您自己的if将退出最里面,立即到我在下面的代码中突出显示的点。正如我所做的那样,添加额外的break代码将退出外部循环:

if ... break;

这有帮助吗?随时要求进一步的解释!

  

编辑-关于循环并行化的注意事项:如果要并行化   外部循环,那么只有在外部循环内部移动for (int i = 0; i < numtracers; i++) { int open_bound = 0; // MUST HAVE HERE to parallelize this loop! // Variable to overwrite the successive positions of each particle vector <double> coord(2); coord[0] = 0.1; coord[1] = 0.2; int result_checkin; for(t=0; t<tau-1; t+=int_step) { save_t = t; // Function to check if coordinates are inside the domain well defined // result_checkin = check_out(coord); if (t == tau-2) result_checkin = 1; if (result_checkin == 1) { // Particle goes outside domain if (open_bound == 0) { break; // Exits the inner for loop and goes to the "-->HERE" line! } else { coord[0]+=0.1; coord[1]+=0.1; } } else { coord[0]+=0.1; coord[1]+=0.1; } } // Your "break" exits the for loop and execution continues -->HERE if (open_bound == 0) break; // This will (always) exit the outer loop! } 的声明/定义时,您才能这样做(就像我   已在上面的代码中完成)!如果您正在尝试,则无法并行化   修改和测试在循环的外部声明的标量变量   范围。

答案 1 :(得分:0)

退出所需的所有循环的一种替代方法是使用bool标志来决定何时强制终止循环。当您按下open_bound=0时,可以先将标志设置为false,然后断开。

检查以下内容以了解我的意思:

 bool go = true;
 for (int i = 0; go &&  CONDITION1; i++)
      for (int j = 0; go &&  CONDITION2; j++)
               for (int k = 0; go &&  CONDITION3; k++)
                     ....
                    if(open_bound==0){
                       go = false;
                       break;
                    }

您的代码的有效版本为here