vectores una recibe que pasar parametros matriz llenar funciones funcion con como bidimensionales bidimensional arreglos arreglo c

una - Pasar matrices multidimensionales como argumentos de función en C



llenar una matriz en c++ con funciones (4)

Pase un puntero explícito al primer elemento con las dimensiones de la matriz como parámetros separados. Por ejemplo, para manejar matrices 2-d de tamaño arbitrario de int:

void func_2d(int *p, size_t M, size_t N) { size_t i, j; ... p[i*N+j] = ...; }

que se llamaría como

... int arr1[10][20]; int arr2[5][80]; ... func_2d(&arr1[0][0], 10, 20); func_2d(&arr2[0][0], 5, 80);

El mismo principio se aplica a las matrices de dimensiones superiores:

func_3d(int *p, size_t X, size_t Y, size_t Z) { size_t i, j, k; ... p[i*Y*Z+j*Z+k] = ...; ... } ... arr2[10][20][30]; ... func_3d(&arr[0][0][0], 10, 20, 30);

En C, ¿puedo pasar una matriz multidimensional a una función como argumento único cuando no sé cuáles serán las dimensiones de la matriz?

Además, mi matriz multidimensional puede contener otros tipos que no sean cadenas.


Puede declarar su función como:

f(int size, int data[][size]) {...}

El compilador hará toda la aritmética del puntero por usted.

Tenga en cuenta que los tamaños de las dimensiones deben aparecer antes que la matriz misma.

GNU C permite el reenvío de declaraciones de argumentos (en caso de que realmente necesite pasar dimensiones después de la matriz):

f(int size; int data[][size], int size) {...}

La primera dimensión, aunque también puede pasar como argumento, es inútil para el compilador de C (incluso para el operador sizeof, cuando se aplica sobre la matriz pasada como argumento siempre se tratará como un puntero al primer elemento).


Puede hacer esto con cualquier tipo de datos. Simplemente conviértalo en un puntero a puntero:

typedef struct { int myint; char* mystring; } data; data** array;

Pero no olvides que todavía tienes que malloc la variable, y se vuelve un poco complejo:

//initialize int x,y,w,h; w = 10; //width of array h = 20; //height of array //malloc the ''y'' dimension array = malloc(sizeof(data*) * h); //iterate over ''y'' dimension for(y=0;y<h;y++){ //malloc the ''x'' dimension array[y] = malloc(sizeof(data) * w); //iterate over the ''x'' dimension for(x=0;x<w;x++){ //malloc the string in the data structure array[y][x].mystring = malloc(50); //50 chars //initialize array[y][x].myint = 6; strcpy(array[y][x].mystring, "w00t"); } }

El código para desasignar la estructura es similar: ¡no olvides llamar a free () en todo lo que malgastaste! (Además, en aplicaciones robustas, debe verificar el retorno de malloc ()) .

Ahora supongamos que desea pasar esto a una función. Todavía puede usar el puntero doble, porque probablemente quiera hacer manipulaciones en la estructura de datos, no el puntero a punteros de estructuras de datos:

int whatsMyInt(data** arrayPtr, int x, int y){ return arrayPtr[y][x].myint; }

Llame a esta función con:

printf("My int is %d./n", whatsMyInt(array, 2, 4));

Salida:

My int is 6.


int matmax(int **p, int dim) // p- matrix , dim- dimension of the matrix { return p[0][0]; } int main() { int *u[5]; // will be a 5x5 matrix for(int i = 0; i < 5; i++) u[i] = new int[5]; u[0][0] = 1; // initialize u[0][0] - not mandatory // put data in u[][] printf("%d", matmax(u, 0)); //call to function getche(); // just to see the result }