La distribución dinámica de la distribución de la matriz 2d en C con una simple matriz 2D de Mpi

Tengo un progtwig MPI para el procesamiento de imágenes (archivo pgm) en MPI C y uso la asignación dinámica para una matriz 2D de la siguiente manera.

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

Cuando yo uso

 float masterbuf[M][N]; 

La imagen que da el progtwig se ve bien.

El problema es que cuando uso la asignación dinámica, la imagen pierde algunos píxeles en su lado izquierdo. Así que estos píxeles perdidos crean una línea negra. Es como si la imagen se hubiera desplazado 2 píxeles a la derecha. No hago ninguna otra operación a la imagen, solo la leo y la imprimo nuevamente.

La función que utilizo para escribir la imagen es:

 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 \n", filename); exit(-1); } printf("Writing %dx %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])  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); } 

Sus dos definiciones de masterbuf pueden crear matrices 2D, pero no lo hacen de la misma manera. La función arralloc () crea espacio para datos y punteros, no solo datos como en la definición de matriz estática simple. Esto significa que en pgmwrite (), mientras que x [i] [j] devolverá el mismo resultado independientemente del método utilizado, x [i] significará dos cosas diferentes debido a la participación del puntero.

Vale la pena señalar que el comstackdor le dará una pista sobre el problema si cambia void *vx en el prototipo a float *vx . Ya que estás lanzando este vacío * de forma inmediata e incondicional a un flotador *, sería una práctica mucho mejor hacer esto de todos modos.

(2ª edición 🙂 Además, si está interesado, consulte esta respuesta . Muestra cómo indexar usando dos dimensiones en un solo bloque malloc’d, sin arralloc ().