0

MPI C に画像処理用の MPI プログラム (pgm ファイル) があり、次のように 2D 配列に動的割り当てを使用しています。

float **masterbuf;
masterbuf = arralloc(sizeof(float), 2, M, N);

私が使うとき

float masterbuf[M][N];

プログラムが与える画像はきれいに見えます。

問題は、動的割り当てを使用すると、画像の左側のピクセルが失われることです。したがって、これらの欠落したピクセルによって黒い線が作成されます。画像が2ピクセル右にシフトされたようなものです。画像に対して他の操作を行うことはありません。画像を読み取って再度印刷するだけです。

画像を書き込むために使用する関数は次のとおりです。

void pgmwrite(char *filename, void *vx, int nx, int ny)
{
  FILE *fp;

  int i, j, k, grey;

  float xmin, xmax, tmp, fval;
  float thresh = 255.0;

  float *x = (float *) vx;

  if (NULL == (fp = fopen(filename,"w")))
  {
    fprintf(stderr, "pgmwrite: cannot create <%s>\n", filename);
    exit(-1);
  }

  printf("Writing %d x %d picture into file: %s\n", nx, ny, filename);

  /*
   *  Find the max and min absolute values of the array
   */

  xmin = fabs(x[0]);
  xmax = fabs(x[0]);

  for (i=0; i < nx*ny; i++)
  {
    if (fabs(x[i]) < xmin) xmin = fabs(x[i]);
    if (fabs(x[i]) > xmax) xmax = fabs(x[i]);
  }

  if (xmin == xmax) xmin = xmax-1.0;

  fprintf(fp, "P2\n");
  fprintf(fp, "# Written by pgmwrite\n");
  fprintf(fp, "%d %d\n", nx, ny);
  fprintf(fp, "%d\n", (int) thresh);

  k = 0;

  for (j=ny-1; j >=0 ; j--)
  {
    for (i=0; i < nx; i++)
    {
      /*
       *  Access the value of x[i][j]
       */

      tmp = x[j+ny*i];

      /*
       *  Scale the value appropriately so it lies between 0 and thresh
       */

      fval = thresh*((fabs(tmp)-xmin)/(xmax-xmin))+0.5;
      grey = (int) fval;

      fprintf(fp, "%3d ", grey);

      if (0 == (k+1)%16) fprintf(fp, "\n");

      k++;
    }
  }

  if (0 != k%16) fprintf(fp, "\n");
  fclose(fp);
}
4

1 に答える 1

2

masterbufの2つの定義は、どちらも2D配列を作成する可能性がありますが、同じ方法では作成されません。関数arralloc()は、単純な静的配列定義の場合のようにデータだけでなく、データとポインター用のスペースを作成します。これが意味することは、pgmwrite()では、x [i] [j]は使用されるメソッドに関係なく同じ結果を返すのに対し、x [i]はポインターの関与により、2つの異なることを意味するということです。

void *vxプロトタイプをに変更した場合、問題についてコンパイラーから手がかりが与えられることに注意してくださいfloat *vx。このボイド*をフロート*に即座に無条件にキャストしているので、とにかくこれを行う方がはるかに良い方法です。

(2回目の編集:)また、興味がある場合は、この応答を確認してください。arralloc()を使用せずに、2つのディメンションを使用して単一のmallocされたブロックにインデックスを付ける方法を示します。

于 2012-11-27T10:28:51.363 に答える