2008-08-06 28 views

Respuesta

19

Puede hacerlo con cualquier tipo de datos. Basta con que sea un puntero puntero a:

typedef struct { 
    int myint; 
    char* mystring; 
} data; 

data** array; 

Pero no se olvide que todavía tiene que malloc la variable, y se pone un poco compleja:

//initialize 
int x,y,w,h; 
w = 10; //width of array 
h = 20; //height of array 

//malloc the 'y' dimension 
array = malloc(sizeof(data*) * h); 

//iterate over 'y' dimension 
for(y=0;y<h;y++){ 
    //malloc the 'x' dimension 
    array[y] = malloc(sizeof(data) * w); 

    //iterate over the 'x' dimension 
    for(x=0;x<w;x++){ 
    //malloc the string in the data structure 
    array[y][x].mystring = malloc(50); //50 chars 

    //initialize 
    array[y][x].myint = 6; 
    strcpy(array[y][x].mystring, "w00t"); 
    } 
} 

El código para anular la planificación de la la estructura se ve similar, no olvides llamar gratis() a todo lo que has malloced. (Además, en aplicaciones robustas, debe check the return of malloc()).

Ahora supongamos que desea pasar esto a una función. Puede seguir utilizando el puntero doble, ya que es probable que desee hacer manipulaciones en la estructura de datos, no el puntero a los punteros de las estructuras de datos:

int whatsMyInt(data** arrayPtr, int x, int y){ 
    return arrayPtr[y][x].myint; 
} 

llamar a esta función con:

printf("My int is %d.\n", whatsMyInt(array, 2, 4)); 

de salida:

My int is 6. 
+0

se necesita ayuda aquí: http: //stackoverflow.com/questions/16943909/manipulate-multidimensional-array-in-a-function – Dchris

+3

Un puntero a la tabla de búsqueda segmentada por puntero no es una matriz 2D. Solo porque permite la sintaxis '[] []', mágicamente no se convierte en una matriz.No puede memcpy(), etc. porque la memoria no está asignada en celdas de memoria adyacentes, lo cual es necesario para las matrices. Su tabla de búsqueda está bastante dispersa por todo el montón, haciendo que las búsquedas sean lentas y el montón fragmentado. – Lundin

31

Pase un puntero explícito al primer elemento con las dimensiones de la matriz como parámetros separados. Por ejemplo, para manejar de tamaño arbitrariamente 2-d arrays de int:

void func_2d(int *p, size_t M, size_t N) 
{ 
    size_t i, j; 
    ... 
    p[i*N+j] = ...; 
} 

que ser llamado como

... 
int arr1[10][20]; 
int arr2[5][80]; 
... 
func_2d(&arr1[0][0], 10, 20); 
func_2d(&arr2[0][0], 5, 80); 

mismo principio se aplica para las matrices superiores dimensión:

func_3d(int *p, size_t X, size_t Y, size_t Z) 
{ 
    size_t i, j, k; 
    ... 
    p[i*Y*Z+j*Z+k] = ...; 
    ... 
} 
... 
arr2[10][20][30]; 
... 
func_3d(&arr[0][0][0], 10, 20, 30); 
+2

'p [i * Y + j * Z + k]' debe ser 'p [i * Y * Z + j * Z + k]' en su lugar. –

+0

http://stackoverflow.com/questions/16943909/manipulate-multidimensional-array-in-a-function – Dchris

+0

¿Cuáles son los valores de i y j? –

-2
int matmax(int **p, int dim) // p- matrix , dim- dimension of the matrix 
{ 
    return p[0][0]; 
} 

int main() 
{ 
    int *u[5]; // will be a 5x5 matrix 

    for(int i = 0; i < 5; i++) 
     u[i] = new int[5]; 

    u[0][0] = 1; // initialize u[0][0] - not mandatory 

    // put data in u[][] 

    printf("%d", matmax(u, 0)); //call to function 
    getche(); // just to see the result 
} 
+0

http://stackoverflow.com/questions/16943909/manipulate-multidimensional-array-in-a-function – Dchris

+1

Esto no es una matriz 2D, es una tabla de búsqueda. Además, esto está etiquetado C. – Lundin

15

Puede declarar su función como:

f(int size, int data[][size]) {...} 

El compilador hará toda la aritmética del puntero por usted.

Tenga en cuenta que los tamaños de las dimensiones deben aparecer antes de la matriz en sí.

GNU C permite el reenvío de declaración de argumento (en caso de que realmente necesita para pasar las dimensiones después de la matriz):

f(int size; int data[][size], int size) {...} 

La primera dimensión, aunque se puede pasar como argumento también, es inútil para el compilador de C (incluso para el operador sizeof, cuando se aplica sobre el conjunto pasado como el argumento siempre tratará es como un puntero al primer elemento).

+1

IMO esta debería ser la respuesta aceptada. No se necesita código adicional y no hay asignaciones de montón innecesarios. simple y limpio – imkendal

+0

Gracias @kjh, también creo que esta es la solución más limpia. La respuesta aceptada es la que funcionó para él. Mira: el OP es de 2008, casi 6 años antes de mi respuesta. Además de eso, no sé si los estándares de C permitieron la sintaxis que he usado aquí. – rslemos

+0

Esta es la solución que finalmente he adoptado para pasar una matriz entera (una matriz bidimensional) de tamaño M x N como argumento de función. Tal vez un poco más de información sea útil: El prototipo de función es como: void f (int N, int data [] [N], int M); En el cuerpo de la función, el elemento [m] [n] se puede escribir como datos [m] [n], muy conveniente, no se necesita cálculo de índice. – jonathanzh

Cuestiones relacionadas