elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Implementación de arreglo de 2-D como función
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Implementación de arreglo de 2-D como función  (Leído 1,343 veces)
FERNIIIIN

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Implementación de arreglo de 2-D como función
« en: 28 Noviembre 2018, 04:40 am »

Buenas chicos, intento implementar una función que imprima los valores de un arreglo 2-d, pero no se que poner en el parámetro donde va la segunda dimensión, con malloc pido memoria para un int o que me recomiendan.

Aqui tengo el problema:
Código
  1. void muestra(int matriz[][], int renglon, int columna)
  2.  

El valor de las dimensiones de mi array es variable, bien puede ser 2x 3 o 20x20.
Lo que tengo de código es:
Código
  1. void muestra(int matriz[][], int renglon, int columna);
  2.  
  3. int main() {
  4.  int M, N, i, j;
  5.  
  6. scanf("%d %d", &M, &N);
  7.  
  8.  int b_minas [M][N];
  9.  
  10.  for (i= 0; i < M; i++) {
  11.    for (j= 0; j < N; j++) {
  12.    scanf("%d", &b_minas[i][j]);
  13.    }
  14.  }
  15.  muestra( b_minas, M, N);
  16.  
  17.  
  18.  return 0;
  19. }
  20.  
  21. void muestra(int matriz[][], int renglon, int columna) {
  22.  printf("\n");
  23.  int i, j;
  24.  
  25.  for (i= 0; i < renglon; i++) {
  26.    for (j= 0; j < columna; j++) {
  27.    printf("%d ", matriz[i][j]);
  28.    }
  29.    printf("\n");
  30.  }
  31. }
  32.  


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Implementación de arreglo de 2-D como función
« Respuesta #1 en: 28 Noviembre 2018, 05:05 am »

Una opción es que uses memoria dinámica y entonces puedes pasar como parámetro un doble puntero. Sin embargo si no has dado memoria dinámica lo que se suele hacer para casos de estos es declarar una matriz más grande de lo necesaria.
Código
  1. const int TAM = 100;
  2.  
  3. void mostrarMatriz(int[][TAM], int, int);
  4.  
  5. int main(){
  6.    int matriz[TAM][TAM];
  7.    int fila = 10, col = 10;
  8.  
  9.    mostrarMatriz(matriz, fila, col);
  10. }
  11.  
  12. void mostrarMatriz(int matriz[][TAM], int fila, int col){
  13.    for(int i = 0; i < fila; i++){
  14.        for(int j = 0; j < col; j++)
  15.            printf("%d  ", matriz[i][j]);
  16.        printf("\n");
  17.    }
  18. }

Es un desperdicio de memoria pero recuerdo que cuando yo estudiaba los temas de arrays n-dimensionales sin memoria dinámica siempre se hacía así. Creas un tamaño inicial más grande de lo necesario y con otra u otras variables indicas cuál es la parte útil.

Espero que te sirva.

PD: Si prefieres usar memoria dinámica y quieres que te ayude con eso coméntamelo.


« Última modificación: 28 Noviembre 2018, 05:28 am por YreX-DwX » En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Implementación de arreglo de 2-D como función
« Respuesta #2 en: 28 Noviembre 2018, 06:03 am »

una matriz es básicamente un arreglo lineal asi que pe podría mandar algo asi:

En main si es una matriz bidimencional, pero como solo se pasa la referencia de la matriz y indicas los tamaños, solo es necesario pasar el apuntador a mostrar y mostrar lo maneja como un arreglo lineal, tratado como matriz.

Código
  1. #include<stdio.h>
  2.  
  3. void muestra(int *matriz, int renglon, int columna);
  4.  
  5. int main() {
  6. int M, N, i, j;
  7. scanf("%d %d", &M, &N);
  8. int b_minas[M][N];
  9. for (i= 0; i < M; i++) {
  10. for (j= 0; j < N; j++) {
  11. scanf("%d",&b_minas[i][j]);
  12. }
  13. }
  14. muestra((int *) b_minas, M, N);
  15. return 0;
  16. }
  17.  
  18. void muestra(int *matriz, int renglon, int columna) {
  19. printf("\n");
  20. int i, j;
  21. for (i= 0; i < renglon; i++) {
  22. for (j= 0; j < columna; j++) {
  23. printf("%d ", matriz[(i*columna) +j]);
  24. }
  25. printf("\n");
  26. }
  27. }
  28.  

Salida:

Código:
C:\codigos>matriz.exe
5 4
1
1
1
1
2
2
2
2
3
3
3
3
4
4
4
4
5
5
5
5

1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5


Saludos!
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Implementación de arreglo de 2-D como función
« Respuesta #3 en: 28 Noviembre 2018, 22:58 pm »

Veo que conoces malloc así que no hay problema en que uses memoria dinámica.
A la hora de generar el array házlo de forma dinámica.
El prototipo de la función que recibiera tu array sería éste:

Código:
void muestra(int **array, int filas, int columnas);

Esto es así porqué si le pasas un array estático estás obligado a darle todas las dimensiones menos la de mayor peso. Esto es así porque C necesita conocer el tamaño de los objetos que va a usar, y cómo se escapa de la explicación de esta respuesta te lo tendrás que creer.

Ahora llega la hora de crear el array. Suponiendo que el número de filas ya está en n_filas y el número de columnas ya está en n_columnas, lo dimensionas de esta forma:

Código:
int **mi_array = malloc(n_filas * sizeof(int*));

for(int i = 0; i < n_filas; ++i)
    mi_array[i] = malloc(n_columnas * sizeof(int));

A la hora de darle un dato a una posición cualquiera del array suponiendo m el número de fila, n el número de columna y x el dato a guardar:

Código:
mi_array[m][n] = x;

Lo mismo que para mostrarlo:

Código:
printf("%d", mi_array[m][n]);

Y a la hora de pasar el array a la función:

Código:
muestra(mi_array, n_filas, n_columnas);

Ahora pensarás:
Pero si C necesita saber el tamaño de un objeto para poderlo usar ¿Por qué se le pasa mi_array sin dimensión alguna, en vez de hacer mi_array[][20], por ejemplo?

La respuesta es que todos los punteros tienen el mismo tamaño. Todos.

Así que te aseguras, de esta forma, que puedes pasarle a esta función un array con un tamaño arbitrario de sus dimensiones que te va a funcionar siempre que los valores que le pases a filas y columnas sean los que realmente tiene dicho array.

Muy importante, eso sí, cuándo dejes de utilizar el array debes liberarlo y eso se debe hacer desde dentro a afuera. Así:

Código:
for(int i = 0; i < n_columnas; ++i)
    free(mi_array[i]);
free(mi_array);
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Arreglo char* en funcion
Programación C/C++
netca 1 2,085 Último mensaje 15 Agosto 2012, 00:06 am
por тαптяα
retornar un arreglo en una funcion!
Desarrollo Web
01munrra 1 2,101 Último mensaje 6 Diciembre 2012, 17:39 pm
por Shell Root
función con arreglo de punteros. C++
Programación C/C++
yookino 2 1,881 Último mensaje 4 Febrero 2014, 23:14 pm
por Yoel Alejandro
función con arreglo de punteros. C++ « 1 2 »
Programación C/C++
yookino 10 6,614 Último mensaje 6 Febrero 2014, 16:59 pm
por yookino
Pasar a función un arreglo con punteros o con el nombre del arreglo como puntero
Programación C/C++
NOB2014 3 3,020 Último mensaje 9 Junio 2016, 17:10 pm
por geeke
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines