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

时间:2016-07-03 10:06:59

标签: c++ for-loop iterator systemc

在以下SystemC SC_THREAD我尝试执行以下操作:image_buffer是一个3行x 720列矩阵,其中填充了从端口{{ 1}}。当p_in有2行并填充前5个字节时,它必须开始将字节复制到另一个名为image_buffer的矩阵中,其大小为576行×720列。如果信号imgh_in,则保存该字节。 true完成后,将生成格式为png的图像。我写的代码的问题是imgi分别总是2和4,只有2个第一行和第3行的4个像素保存在图像中。你能否告诉我如何实施这个?

j

更新 我修改了代码如下,但是当我这样做时,新计数器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 } } } } bi始终是bj

0

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您不希望循环复制到的第二个数组。您需要跟踪第二组索引变量,这些变量基于外部循环递增。

int ii, jj
for i = 0 to n
  for j = 0 to m
    if i > v and j > u  
      img[ii,jj] = val
      ++ii, ++jj

答案 1 :(得分:1)

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

  1. 缓冲区最初填充 - (bufrow,bufcol)增量, (row,col)
  2. 缓冲区正在填充并复制到图像 - h 是真的&amp;&amp; (bufrow,bufcol)在某些时候已超过(2,5) (sticky buffer_is_ready指标)
  3. 缓冲区未填充(!h), 但复制到图像正在发生 - 增加(row,col)
  4. 您可能希望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;
      }
    

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