c++ - 如何在循环中开始新的迭代?

标签 c++ for-loop iterator systemc

在下面的 SystemC SC_THREAD 中,我正在尝试执行以下操作:image_buffer 是一个 3 行 x 720 列的矩阵,已填充使用从端口 p_in 传入的字节。当 image_buffer 有 2 行并且前 5 个字节已填充时,它必须开始将字节复制到另一个名为 img 的矩阵中,其大小为 576 行 x 720 列。只要信号 h_intrue,字节就会被保存。当 img 完成后,将生成一个 png 格式的图像。我写的代码的问题是 ij 分别总是 2 和 4,只保存了第一行的 2 行和第三行的 4 个像素取消图像。你能给我一个关于如何实现这个的提示吗?

void FILTER::filtering(){

    while(1){

        while(!h_in) wait(h_in.posedge_event());    

        for(i=0; i<3; i++){
            for(j=0; j<720; j++){
                image_buffer.pixel[i*image_buffer.width+j] = p_in;
                wait();
                while(!h_in) wait();

            //Begin of the block code I'm trying to test with
            if ( (i > 1) && (j > 3) ){      
                for(int bi=0; bi<576; bi++){
                    for(int bj=0; bj<720; bj++){
                        if (bi < 3){
                            img.pixel[bi*img.width+bj] = image_buffer.pixel[bi*image_buffer.width+bj];
                        }
                        else{
                            img.pixel[bi*img.width+bj] = image_buffer.pixel[(bi%3)*image_buffer.width+bj];
                        }

                        cout << "i: " << i << " j: " << j << endl;

                        if ( (bi == 575)&&(bj == 719) ){
                            image_write( &img, "test.png" );
                            exit(1);
                        }
                    }
                }
            }
            wait();
            //End of the block code I'm trying to test with

            }

        }

    }
}

更新 我修改了代码如下,但是当我这样做时,新的计数器 bibj 总是 0:

while(1){

    while(!h_in) wait(h_in.posedge_event());    

    k = 0;

    for(i=0; i<3; i++){
        for(j=0; j<720; j++){
            image_buffer.pixel[i*image_buffer.width+j] = p_in;
            wait();
            while(!h_in) wait();

            if( (i == 2 )&&(j > 4) ){

                for(bi=i-2; bi<576; i++){
                    for(bj=j-5; bj<720; j++){
                            cout << "bi: " << bi << "   bj: " << bj << endl;
                            img.pixel[bi*img.width+bj] = image_buffer.pixel[bi*image_buffer.width+bj];
                    }
                }

            }   
        }
    }
}

最佳答案

要执行单线程解决方案,您将遍历最终图像的尺寸,并跟踪 (row,col)和计算出的 (bufrow,bufcol) .您可能不想为此使用 for 循环,因为您将拥有可以增加图像位置和缓冲区位置的迭代。每次迭代都可以具有以下条件之一:

  1. 缓冲区最初正在填充 - (bufrow,bufcol)增量, (row,col)不要
  2. 缓冲区正在填充并复制到图像 - h 是真的 && (bufrow,bufcol)在某个点上超过了 (2,5) (粘性 buffer_is_ready 指示器)
  3. 缓冲区未填充 ( !h ), 但正在复制到图像 - 递增 (row,col)

您可能需要一个 while(row<576&&col<720)作为你唯一的循环(在 while(1) 内)。在每次迭代中,手动处理 (row,col) 和 (bufrow,bufcol) 的增量。不要忘记缓冲区环绕:

  if (h) {
    bufrow = (bufcol == 719 && bufrow == 2) ? 0 
             (bufcol == 719)                ? bufrow+1 : bufrow;
    bufcol = (bufcol == 719) ? 0 : bufcol+1;
  }

它还可以简化代码以使用双线程解决方案。使用两个线程还可以将缓冲区填充与任何计算和复制到最终图像分离。

关于c++ - 如何在循环中开始新的迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38168839/

相关文章:

c++ - 如何使用指针从不同的函数访问局部变量?

c++ - MySQL C++ 未实现异常

c++ - 为什么垫子的尺寸不同?

c++ - 如何在 makefile 中只编译一个 .h 文件?

c++ - 为什么容器需要const

scala - 如何将迭代器中的项目 T 分组到 Iterator[Seq[T]]

c++ - 类型命名迭代器不是类型

java - 如何在另一个调用中正确返回 token ?

matlab - for 循环中或执行循环展开时函数的不同行为

c++ - 按变量递增for循环