arreglos bidimensionales y funciones

Iniciado por m@o_614, 13 Julio 2013, 00:32 AM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

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

rir3760

¿C o C++?

----

En el caso de C cuando una función se declara en cualquiera de las dos formas:
int fn(int a[]);

/* O bien: */
int fn(int a[123]);

En realidad se procesa así:
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:
#include <stdio.h>
#include <stdlib.h>

/* array_10_int == array de 10 elementos de tipo int */
typedef int array_10_int[10];

void fn(array_10_int array[1000], size_t num_elem);

int main(void)
{
   array_10_int a[10];
   size_t num_elem = sizeof a / sizeof a[0];
   int i;
   int j;
   
   for (i = 0; i < num_elem; i++)
      for (j = 0; j < 10; j++)
         a[i][j] = i * 10 + j;
   
   fn(a, num_elem);
   
   return EXIT_SUCCESS;
}

void fn(array_10_int array[], size_t num_elem)
{
   size_t i;
   size_t j;
   
   for (i = 0; i < num_elem; i++){
      for (j = 0; j < 10; j++)
         printf("%4d", array[i][j]);
     
      putchar('\n');
   }
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

m@o_614

muchas gracias por tu respuesta, una ultima duda, por que utilizas el typedef???

eferion

typedef te permite asignar un alias... sirve para mejorar la legibilidad del código.

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.