Necesito hacer esto para mantener las operaciones en la matriz también. ¿Eso significa que debe pasar por referencia?Cómo pasar matriz 2D (matriz) en una función en C?
¿Esto es suficiente?
void operate_on_matrix(char matrix[][20]);
Necesito hacer esto para mantener las operaciones en la matriz también. ¿Eso significa que debe pasar por referencia?Cómo pasar matriz 2D (matriz) en una función en C?
¿Esto es suficiente?
void operate_on_matrix(char matrix[][20]);
C no tiene realmente matrices multidimensionales, pero hay varias maneras de simular ellos. La forma de pasar dichas matrices a una función depende de la forma utilizada para simular las múltiples dimensiones:
1) Use una matriz de matrices. Esto sólo se puede utilizar si los límites de la matriz se determinan totalmente en tiempo de compilación, o si su compilador soporta VLA's:
#define ROWS 4
#define COLS 5
void func(int array[ROWS][COLS])
{
int i, j;
for (i=0; i<ROWS; i++)
{
for (j=0; j<COLS; j++)
{
array[i][j] = i*j;
}
}
}
void func_vla(int rows, int cols, int array[rows][cols])
{
int i, j;
for (i=0; i<rows; i++)
{
for (j=0; j<cols; j++)
{
array[i][j] = i*j;
}
}
}
int main()
{
int x[ROWS][COLS];
func(x);
func_vla(x, rows, cols);
}
2) Utilizar un (matriz de punteros asignada dinámicamente) a (arrays) asignados dinámicamente. Esto se usa principalmente cuando los límites de la matriz no se conocen hasta el tiempo de ejecución.
void func(int** array, int rows, int cols)
{
int i, j;
for (i=0; i<rows; i++)
{
for (j=0; j<cols; j++)
{
array[i][j] = i*j;
}
}
}
int main()
{
int rows, cols, i;
int **x;
/* obtain values for rows & cols */
/* allocate the array */
x = malloc(rows * sizeof *x);
for (i=0; i<rows; i++)
{
x[i] = malloc(cols * sizeof *x[i]);
}
/* use the array */
func(x, rows, cols);
/* deallocate the array */
for (i=0; i<rows; i++)
{
free(x[i]);
}
free(x);
}
3) Utilice una matriz unidimensional y arregle los índices. Esto puede ser usado con tanto estática asignada (de tamaño fijo) y las matrices de asignación dinámica:
void func(int* array, int rows, int cols)
{
int i, j;
for (i=0; i<rows; i++)
{
for (j=0; j<cols; j++)
{
array[i*cols+j]=i*j;
}
}
}
int main()
{
int rows, cols;
int *x;
/* obtain values for rows & cols */
/* allocate the array */
x = malloc(rows * cols * sizeof *x);
/* use the array */
func(x, rows, cols);
/* deallocate the array */
free(x);
}
No sé qué quiere decir con "datos no consiguen perdidos". He aquí cómo se pasa una matriz 2D normal a una función:
void myfunc(int arr[M][N]) { // M is optional, but N is required
..
}
int main() {
int somearr[M][N];
...
myfunc(somearr);
...
}
factoide aleatoria: La razón se requiere N es porque el equipo tiene que saber qué tan avanzado para incrementar el puntero para cada "fila". Realmente, todas las dimensiones excepto la primera son necesarias. C almacena las matrices como fragmentos de memoria, sin delimitadores. –
datos no se pierden significa sin utilizar malloc. Gracias por la ayuda. – Shweta
@Christian Mann: Eso es un buen factoid. Hoy le escribí una explicación muy elaborada :-) http://stackoverflow.com/questions/3906777/error-defining-and-initializing-multidimensional-array/3910533#3910533 – Arun
Si el compilador no admite VLA, puede hacerlo de forma sencilla haciendo pasar la matriz 2D como int * con la fila y col. En la función de recepción, regenere el índice de matriz 1d a partir de 2d índices de matriz.
int
getid(int row, int x, int y) {
return (row*x+y);
}
void
printMatrix(int*arr, int row, int col) {
for(int x = 0; x < row ; x++) {
printf("\n");
for (int y = 0; y <col ; y++) {
printf("%d ",arr[getid(row, x,y)]);
}
}
}
main()
{
int arr[2][2] = {11,12,21,22};
int row = 2, col = 2;
printMatrix((int*)arr, row, col);
}
#include <iostream>
using namespace std;
void printarray(int *a, int c,int r)
{
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
cout << "\t" << *(a + i*c + j) << "\t"; // a is a pointer refer to a 2D array
}
cout << endl << "\n\n";
}
}
int main()
{
int array[4][4] =
{{1 ,2 ,3 ,4 },
{12,13,14,5 },
{11,16,15,6 },
{10,9 ,8 ,7 }};
printarray((int*)array,4,4);
// here I use print function but u can use any other useful function like
//setArray((int *) array,4,4);
return 0;
}
Esto tiene la etiqueta C, no C++. – Lundin
En la primera forma mencionada anteriormente, el código no se compilará. "filas" y "cols" en las líneas 17 y 35 deben cambiar a "FILAS" y "COLAS", respectivamente. – KZcoding
'void func_vla (int matriz [filas] [cols], int filas, int cols)' debe ser 'void func_vla (int filas, int cols, int matriz [filas] [cols])' –