[C con Clase] Arrays multidimensionales como parametros de una funcion

Steven Davidson steven en conclase.net
Mar Mayo 15 21:51:09 CEST 2007


Hola Rafael,

El pasado 2007-05-15 17:37:13, Rafa escribió:

R> Hola a todos,
R> me gustaría saber si alguien puede echarme una mano con lo siguiente:
R> quiero pasar una serie de arrays multidimensionales de dimensión
R> variable como parámetros de una función para multiplicar matrices,
R> calcular potencias de una matriz, etc., pero no se como hacerlo, ya que
R> tengo que poner la dimensión del array al declarar la función. Si
R> alguien sabe como solventar este problema por favor, me conteste lo
R> antes posible.

Efectivamente, si usas arrays estáticos multidimensionales, el compilador obviamente te pide información acerca de todas las dimensiones menos la primera que no es necesaria. Esto es porque el compilador necesita esta información para llevar a cabo ciertos cálculos si se intenta acceder a elementos de tal array. Tienes dos opciones, si quieres aceptar un array multidimensional:

1. Recibir un array de una sola dimensión al igual que los parámetros que indiquen las dimensiones. Esto implica que tendrás que hacer esos cálculos del compilador explícitamente para poder acceder al elemento que quieras. Por ejemplo,

void func( int lista[], unsigned n, unsigned m, unsigned l )
{
  ...
  unsigned nIndice = 20*m*l + 10*l + 5;  // Acceder: lista[20][10][5]

  lista[nIndice]++;
  ...
}

Esto significa que tendremos que pasar nuestro array multidimensional como un array unidimensional. Por ejemplo,

int main()
{
  int MiLista[400][200][300];
  ...
  func( MiLista[0][0], 400, 200, 300 );
  ...
}

2. Recibir una estructura la cual contiene un array multidimensional. Por ejemplo,

struct stArray
{
  int lista[400][200][300];
};

void func( stArray &ref, unsigned n, unsigned m, unsigned l )
{
  ...
  ref.lista[20][10][5]++;
  ...
}

También podríamos haber incluido las dimensiones en la estructura. Por ejemplo,

struct stArray
{
  int lista[400][200][300];
  unsigned n, m, l;
};

void func( stArray &ref )
{
  ...
  ref.lista[20][10][5]++;
  ...
}


Otra manera es usar arrays dinámicos, por lo que tendrás que manejar punteros a punteros. Por ejemplo,

void func( int ***pLista, unsigned n, unsigned m, unsigned l )
{
  ...
  plista[20][10][5]++;
  ...
}

El engorro está en la creación y liberación dinámica de la memoria para poder guardar la información en el array dinámico.


Espero que esto te sirva.

Steven


Más información sobre la lista de distribución Cconclase