Foros del Web » Programación para mayores de 30 ;) » C/C++ »

editar matriz desde una funcion en c

Estas en el tema de editar matriz desde una funcion en c en el foro de C/C++ en Foros del Web. Hola, quisiera que alguien me explicase como puedo editar una matrix[5][5] desde una función. Tengo una matrix en la funcion main, la cual tengo que ...
  #1 (permalink)  
Antiguo 10/03/2015, 16:56
Ic4r0
Invitado
 
Mensajes: n/a
Puntos:
editar matriz desde una funcion en c

Hola, quisiera que alguien me explicase como puedo editar una matrix[5][5] desde una función.
Tengo una matrix en la funcion main, la cual tengo que inicializar en esta y posteriormente y gracias a un menu tengo que editarla para ello he creado una función y no consigo editarla.

alguien me puede explicar como puedo editarla pasando la matriz por punteros o algún otro método?
pd: he usado punteros y referencias pero nunca de función a función...
tengo esto pero quiero con puntero xD
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. void fun1(int c[2][2]);
  4. void fun2(int c[2][2]);
  5. int main(){
  6.     int c[2][2],i,j;
  7.     for(i=0;i<3;i++){
  8.         for(j=0;j<3;j++){
  9.             c[i][j]=100;
  10.         }
  11.     }
  12. fun1(c);
  13.     fun2(c);
  14.  
  15.     return(0);
  16. }
  17.  
  18. void fun2(int c[2][2]){
  19.     int i,j,x,h;
  20.     printf("\nMostrar: ");
  21.     for(i=0;i<2;i++){
  22.         for(j=0;j<2;j++){
  23.             printf("%d\n",c[i][j]);
  24.         }
  25.     }
  26.    
  27. }
  28. void fun1(int c[2][2]){
  29.     int i,j,x,h;
  30.    
  31.     printf("Seleccione dia a editar: ");
  32.     scanf("%i",&x);
  33.  
  34.     if(x>=0 &&x<3){
  35.         printf("introduce contenido: ");
  36.         scanf("%i",&h);
  37.         c[x][0]=h;
  38.     }
  39.     /*
  40.     printf("Introduce 4 numeros: ");
  41.     for(i=0;i<2;i++){
  42.         for(j=0;j<2;j++){
  43.             scanf("%d",&c[i][j]);
  44.         }
  45.     }*/
  46. }

Última edición por Ic4r0; 10/03/2015 a las 17:25
  #2 (permalink)  
Antiguo 11/03/2015, 01:09
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: editar matriz desde una funcion en c

"int c[2][2]" es un puntero. No le des más vueltas, aunque no tenga el asterisco, una matriz o un vector de elementos declarado así obliga al compilador a usar punteros
  #3 (permalink)  
Antiguo 11/03/2015, 12:36
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: editar matriz desde una funcion en c

Cita:
Iniciado por eferion Ver Mensaje
"int c[2][2]" es un puntero.
Aunque un array decae en puntero ante la primera oportunidad que se le presente, arrays y punteros son tipos de dato diferentes.

Acá abajo va un ejemplo con llamadas a tres funciones.
La primera es la habitual, donde el array decae en puntero, manejado por abajo por el compilador, perdiendo la información de sus dimensiones.
Las otras pueden hacerse templates, ya que los arrays conservan la informacion de sus dimensiones.

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. void muestra(int c_array[][3])
  4. {
  5.     for (int i=0; i<2; ++i) {
  6.         for (int j=0; j<3; ++j) {
  7.             std::cout << c_array[i][j] << ' ';
  8.         }
  9.         std::cout << '\n';
  10.     }
  11. }
  12.  
  13. template <size_t F, size_t C>
  14. void muestra1(int (*c_array)[F][C]) {
  15. // toma por valor un puntero a array de FxC enteros
  16.     for (int i=0; i<F; ++i) {
  17.         for (int j=0; j<C; ++j) {
  18.             std::cout << (*c_array)[i][j] << ' ';
  19.         }
  20.         std::cout << '\n';
  21.     }
  22. }
  23.  
  24. template <size_t F, size_t C>
  25. void muestra2(int(&c_array)[F][C])
  26. // toma la referencia de un array de FxC enteros
  27. {
  28.     for (int i=0; i<F; ++i) {
  29.         for (int j=0; j<C; ++j) {
  30.             std::cout << c_array[i][j] << ' ';
  31.         }
  32.         std::cout << '\n';
  33.     }
  34. }
  35.  
  36. int main()
  37. {
  38.  
  39.     int arr[2][3] = { {0, 1, 2 }, {3, 4, 5} };
  40.  
  41.     muestra(arr);
  42.     std::cout << '\n';
  43.  
  44.     int(*p)[2][3] = &arr; // puntero al arr de 2x3
  45.     muestra1(p); // p se pasa por valor
  46.     std::cout << '\n';
  47.  
  48.     muestra2(arr); // arr se pasa por referencia
  49.     std::cout << '\n';
  50.  
  51. }
  #4 (permalink)  
Antiguo 12/03/2015, 22:49
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 12 años, 4 meses
Puntos: 22
Respuesta: editar matriz desde una funcion en c

Hola Ic4r0.

De modo general, un arreglo no es un apuntador. El segundo es una variable a la que se le puede asignar valores, incrementar, etc., mientras que el primero no.

Vg., es correcto:
Código C:
Ver original
  1. {
  2.   int *ip, v[5]={0,1,2,3,4};
  3.  
  4.   ip = v;  // ip -> v[0]
  5.   ip++;    // ip -> v[1]
  6.   (*ip)++; // v[1] = 2
Pero no es así a la inversa:
Código C:
Ver original
  1. {
  2.   int *ip, v[5]= {0,1,2,3,4};
  3.  
  4.   v = p     // error
  5.   v++;      // error
  6.   ...
Sin embargo, cuando se envía un nombre de arreglo como parámetro, se está enviando la posición del primer elemento del mismo y dentro de la función es una variable local. Es decir que en este caso sí se trata de un apuntador.

Un ejemplo muy simple con tres formas de declarar el parámetro y modificar los valores de la matriz enviada como argumento en C:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. // 1) como un arreglo de arreglos de 3 enteros
  4. void init1(int [][3], int);
  5. // 2) como un puntero a un arreglo de tres enteros
  6. void init2(int (*)[3], int);
  7. // 3) como un puntero al primer elemento del argumento
  8. void init3(int *, int , int );
  9.  
  10. void showMat(int [][3], int);
  11.  
  12. int main() {
  13.   int m1[3][3] ,m2[3][3], m3[3][3];
  14.  
  15.   init1(m1, 3);
  16.   init2(m2, 3);
  17.   init3(m3, 3, 3);
  18.   showMat(m1, 3);
  19.   showMat(m2, 3);
  20.   showMat(m3, 3);
  21.  
  22.   return 0;
  23. }
  24.  
  25. // 1)
  26. void init1(int mt[][3], int rows) {
  27.   int c, r;
  28.   for(r=0; r<rows; r++)
  29.     for(c=0; c<3; c++)
  30.       mt[r][c] = 1;
  31. }
  32. // 2)
  33. void init2(int (*mt)[3], int rows) {
  34.   int c, r;
  35.   for(r=0; r<rows; r++)
  36.     for(c=0; c<3; c++)  
  37.       mt[r][c] = 2;
  38. }
  39. // 3)
  40. void init3(int* mt, int cols, int rows) {
  41.   int c, r;
  42.   for(r=0; r<rows; r++)
  43.     for(c=0; c<cols; c++)  
  44.       mt[r*cols+c] = 3;
  45. }
  46.  
  47. void showMat(int mt[][3], int rows) {
  48.   int c, r;
  49.   for(r=0; r<rows; r++) {
  50.     for(c=0; c<3; c++) printf("%3d", mt[r][c]);
  51.     printf("\n");
  52.   }
  53.   printf("-------------------\n");
  54. }

Saludos.

Etiquetas: funcion, matriz, punteros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:42.