2010-08-05 30 views
5

Tengo una matriz bidimensional asignada dinámicamente en mi código C, en la función principal. Necesito pasar esta matriz 2D a una función. Como las columnas y filas de la matriz son variables de tiempo de ejecución, sé que una forma de pasarlo es:¿Cómo pasar una matriz 2D dinámicamente asignada a una función?

-Pass las filas y las variables de columna y el puntero a ese elemento [0] [0] de la matriz

myfunc(&arr[0][0],rows,cols) 

luego en la función llamada, acceder a él como un 'aplanada' 1D matriz como:

ptr[i*cols+j] 

Pero yo no quiero hacerlo de esa manera, porque eso significaría una gran cantidad de cambio en el código, ya que antes, la matriz 2D pasada a esta función estaba asignada estáticamente con sus dimensiones conocidas en tiempo de compilación

Entonces, ¿cómo puedo pasar una matriz 2D a una función y todavía ser capaz de usarla como una matriz 2D con 2 índices como el siguiente?

arr[i][j]. 

Cualquier ayuda será apreciada.

Respuesta

7
#include <stdio.h> 
#include <stdlib.h> 
void doit(int ** s , int row , int col) 
{ 
    for(int i =0 ; i <col;i++){ 
      for(int j =0 ; j <col;j++) 
       printf("%d ",s[i][j]); 
      printf("\n"); 
    } 
} 
int main() 
{ 
    int row =10 , col=10; 
    int ** c = (int**)malloc(sizeof(int*)*row); 
    for(int i =0 ; i <col;i++) 
     *(c+i) = (int*)malloc(sizeof(int)*row); 
    for(int i =0 ; i <col;i++) 
      for(int j =0 ; j <col;j++) 
       c[i][j]=i*j; 
    doit(c,row,col); 
} 

Esperanza esta es la forma en que desea ....

+0

Esto es todo, aunque el código tiene pequeños errores en la memoria. alloc parte ... pero entendí la esencia. – goldenmean

1

Realmente no puede hacer esto sin cambiar una gran cantidad de código. Sugiero envolver esto en una estructura que contenga los límites y luego usar regexp search'n'replace para arreglar los accesos.

Quizás use una macro como AA(arr,i,j) (como en Array Access) donde arr es la estructura.

+0

Así que básicamente están diciendo u - de ninguna manera programática para hacerlo, pero 'buscar y reemplazar '. ¿Es correcto? – goldenmean

+0

Sí, esa es la esencia de eso. –

1

Hasta donde yo sé, todo lo que puede pasar a una función es un puntero al primer elemento de una matriz. Cuando pasa una matriz real a una función, se dice que "la matriz se descompone en un puntero", por lo que no queda información sobre el tamaño de la matriz apuntada.

Una referencia a un objeto del tipo array-of-T que aparece en una expresión decae (con tres excepciones) en un puntero a su primer elemento; el tipo del puntero resultante es puntero-a-T.

Creo que podrá encontrar más información al respecto en el C FAQ.

0

Numerical recipes in C (un libro que trata principalmente en matrices) sugiere una forma de hacer esto limpiamente y aún tratar con matrices 2D. Consulte la sección 1.2 "Matrices y matrices 2D" y el método convert_matrix().

Esencialmente lo que necesita es asignar un conjunto de punteros para apuntar a sus vectores de filas. Y pase esto a su función junto con el número de filas y columnas.

2

Si su compilador soporta C99 de longitud variable arrays entonces se puede declarar una función como tal (por ejemplo CCG.):

int foo(int cols, int rows, int a[][cols]) 
{ 
    /* ... */ 
} 

Se podría también utilizar un puntero a un tipo de VLA en el código de llamada:

int (*a)[cols] = calloc(rows, sizeof *a); 
/* ... */ 
foo(cols, rows, a); 
0

Una matriz de 2 d en C es simplemente una matriz de matrices.Aquí ya go:

void with_matrix(int **matrix, int rows, int cols) { 
    int some_value = matrix[2][4]; 
} 

int main(int argc, char **argv) { 
    int **matrix; 
    ... create matrix ... 
    with_matrix(matrix, rows, cols); 
} 
0
int cols = 4; 
    int rows = 3; 
    char** charArray = new char*[rows]; 
    for (int i = 0; i < rows; ++i) { 
     charArray[i] = new char[cols]; 
    } 

    // Fill the array 
    for (int i = 0; i < rows; ++i) { 
     for (int j = 0; j < cols; ++j) { 
      charArray[i][j] = 'a'; 
     } 
    } 

    // Output the array 
    for (int i = 0; i < rows; ++i) { 
     for (int j = 0; j < cols; ++j) { 
      cout << charArray[i][j]; 
     } 
     cout << endl; 
    } 
+0

Agregue más información sobre lo que intenta hacer –

Cuestiones relacionadas