2010-07-01 32 views
7

¿Cómo puedo pasar una matriz multidimensional a una función en C/C++?¿Cómo puedo pasar una matriz multidimensional a una función?

Las dimensiones de la matriz no se conocen en tiempo de compilación

+0

@ GMan- Si la matriz se asignó dinámicamente con tamaños basados ​​en la entrada del usuario, entonces el tamaño no se conocería en tiempo de compilación. – bta

Respuesta

9

Un puntero al comienzo de la matriz junto con las dimensiones - y luego hacer la aritmética matriz en la función es la solución más común.

o uso boost

+0

http://gandalf-library.sourceforge.net/ too – rwong

1

usar un vector de vectores, se puede pasar un vector.

+0

Esto es ineficaz, a excepción de la matriz dentada (donde cada fila puede tener una longitud diferente de la otra), o cuando los elementos son cadenas, etc. También, en caso de que el asker está buscando una cantidad variable de dimensiones (lo que no sabemos todavía), los vectores no resolverían ese problema porque los vectores son typedef'ed. – rwong

1

Puede pasar un puntero y tamaños, o utilizar un std::vector. Pero la solución "real" es con una plantilla:

template <size_t N, size_t M> 
void foo(int (&pArray)[N][M]); 

Esta plantilla función acepta una N por M matriz de INT, por referencia. Tenga en cuenta que esta es una plantilla de función, no una función, por lo que obtiene una función instanciada diferente por tipo de matriz.

+0

Las plantillas no son útiles cuando las dimensiones de la matriz no se conocen en tiempo de compilación. – n0rd

+0

@ n0rd: Oh, me salté esa parte. Aunque la pregunta es extremadamente trivial o absurda, entonces. – GManNickG

1

creo que esto es una extensión de GCC (o una característica bastante moderno C), pero puede ser muy conveniente:

void foo(int bar[n][m], int n, int m) {...} 
+0

¿No tiene que proporcionar valores constantes para n y m en tiempo de compilación? Lo haces en mi C++ Builder 2010. (Según la pregunta, los dim son desconocidos en compilación. – Tom

1

puede pasar el puntero a sus iniciales en la posición de memoria de su matriz multi dimensión. también debe pasar el tamaño de la matriz, es decir, el límite de cada dimensión.

es decir

int var [x][y][z]; 
func (var, x, y, z); 

función definintion:

void func (int*, int, int, int); 
3

Pasando la matriz es fácil, lo difícil es acceder al array dentro de su función. Como se señala en algunas de las otras respuestas, puede declarar el parámetro a la función como un puntero y también pasar el número de elementos para cada dim del conjunto.

#define xsize 20 
#define ysize 30 
int array[xsize][ysize]; 
void fun(int* arr, int x, int y) 
{ 
// to access element 5,20 
int x = arr[y*5+20]; 
} 

fun(array, xsize, ysize); 

Por supuesto, he dejado fuera todo el asunto de la asignación de la matriz (ya que no se sabe lo que su tamaño será, realmente no se puede utilizar # define (y algunos dicen que son mal de todos modos)

0

Sólo estoy resumiendo las opciones de otros mensajes.

Si se desconoce el número de dimensiones (el N como en la matriz n-dimensional), la única manera es utilizar una matriz multidimensional de C++ Hay varias implementaciones disponibles públicamente, de Boost u otras bibliotecas. Consulte Martin Beckett's publicación.

Si se conoce el número de dimensiones pero el tamaño de la matriz es dinámico, consulte Tom's respuesta para acceder a un elemento de la matriz (convertir múltiples índices en puntero del elemento). La matriz en sí tendrá que ser asignada con malloc o nueva.

Si está escribiendo la clase de matriz multidimensional usted mismo, necesitará saber acerca de Row-major-order, orden de columnas mayores, etc.

A saber, si los dimensios matriz es (Size1, Size2, Size3, ..., SizeN), entonces:

  • El número de elementos de la matriz es (Size1 * Size2 * Size3 * ... * SizeN)
  • la memoria necesaria es sizeof(value_type) * numOfElements
  • Para acceder al elemento (index1, index2, index3, ..., indexN), utilice
    • ptr[ index1 + (Size1 * index2) + (Size1 * Size2 * index3) + ... ] suponiendo que el primer índice de matriz es el fastest-moving dimension
+0

index1 + (Size1 * index2) + (Size1 * Size2 * index3) + ... está mejor escrito como i1 + size1 * (i2 + size2 * (...)) ...) –

+0

@Alexandre: De acuerdo. Conozco http://en.wikipedia.org/wiki/Horner_scheme. Solo quiero mostrar la fórmula de una manera que se pueda escribir en un bucle, etc. – rwong

+0

perdón, me refiero a "matemáticamente". – rwong

0

Un método simple es aplanar la matriz e iterar usando las dimensiones.

#include <stdio.h> 

void print_array(int *arr,int row,int col) 
{ 
    int i,j; 
    for(i=0;i<row;i++){   
     for(j=0;j<col;j++){ 
      printf("%d ",*(arr+i*col+j)); 
     } 
     printf("\n"); 
    } 
} 

int main() 
{ 
int a[2][3] = {{1,0,2},{-1,3,1}}; 
int b[4] = {1,2,3,34}; 
print_array(a,2,3); 
return 0; 
} 

Esta técnica funciona pero al acoplar una matriz puede evitar optimizaciones del compilador que a su vez pueden dar como resultado una ejecución lenta.

Cuestiones relacionadas