Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 13 Julio 2013, 00:32 am



Título: arreglos bidimensionales y funciones
Publicado por: m@o_614 en 13 Julio 2013, 00:32 am
Saludos

Tengo una duda de como pasar un arreglo bidimensional a una  funcion cualquiera, si tengo una matriz que se llama multi[filas][columnas] y la quiero pasar a una funcion con la siguiente llamada:

set_value(multi);

por que en la funcion tengo que dejar el corchete[] de las filas vacio y el de las columnas con su respectivo tamanio es algo que no termino de entender y queria saber si alguien me lo podia explicar:

void set_value(int m_arreglo[][COLUMNAS])
{
     //Cuerpo de la funcion
}

de antemano gracias


Título: Re: arreglos bidimensionales y funciones
Publicado por: rir3760 en 13 Julio 2013, 02:44 am
¿C o C++?

----

En el caso de C cuando una función se declara en cualquiera de las dos formas:
Código
  1. int fn(int a[]);
  2.  
  3. /* O bien: */
  4. int fn(int a[123]);
En realidad se procesa así:
Código
  1. int fn(int *a);

Y cuando se llama a la función pasando como argumento el nombre de un array este se sustituye por la dirección en memoria de su primer elemento. Por ello no es necesario (ni se recomienda) indicar el numero de elementos del array (no tiene caso).

----

Lo que tu llamas "matriz" solo es un array y por ende no debes indicar el numero de elementos (filas), debes indicar el numero de columnas porque ello es parte del tipo de cada elemento del array.

Para explicarlo mejor un ejemplo en C utilizando alias:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /* array_10_int == array de 10 elementos de tipo int */
  5. typedef int array_10_int[10];
  6.  
  7. void fn(array_10_int array[1000], size_t num_elem);
  8.  
  9. int main(void)
  10. {
  11.   array_10_int a[10];
  12.   size_t num_elem = sizeof a / sizeof a[0];
  13.   int i;
  14.   int j;
  15.  
  16.   for (i = 0; i < num_elem; i++)
  17.      for (j = 0; j < 10; j++)
  18.         a[i][j] = i * 10 + j;
  19.  
  20.   fn(a, num_elem);
  21.  
  22.   return EXIT_SUCCESS;
  23. }
  24.  
  25. void fn(array_10_int array[], size_t num_elem)
  26. {
  27.   size_t i;
  28.   size_t j;
  29.  
  30.   for (i = 0; i < num_elem; i++){
  31.      for (j = 0; j < 10; j++)
  32.         printf("%4d", array[i][j]);
  33.  
  34.      putchar('\n');
  35.   }
  36. }

Un saludo


Título: Re: arreglos bidimensionales y funciones
Publicado por: m@o_614 en 13 Julio 2013, 05:42 am
muchas gracias por tu respuesta, una ultima duda, por que utilizas el typedef???


Título: Re: arreglos bidimensionales y funciones
Publicado por: eferion en 16 Julio 2013, 22:33 pm
typedef te permite asignar un alias... sirve para mejorar la legibilidad del código.

Código
  1. typedef unsigned char uchar;

Con esta línea defines un tipo nuevo "uchar" que se corresponde con un "unsigned char"... pero más corto y legible. Hacerlo con estructuras te permite omitir la palabra "struct" cada vez que quieras definir una variable o puntero a una estructura.