2010-08-05 3 views
5

Ho una matrice bidimensionale allocata dinamicamente nel mio codice C, nella mia funzione principale. Ho bisogno di passare questo array 2D a una funzione. Poiché le colonne e le righe dell'array sono variabili di tempo di esecuzione, so che un modo per passarlo è:Come passare un array 2D assegnato in modo dinamico a una funzione?

-Passare le righe e le variabili di colonna e il puntatore a quell'elemento [0] [0] dell'array

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

poi nella funzione chiamata, accedere come un 'appiattito fuori' 1D serie come:

ptr[i*cols+j] 

Ma io non voglio farlo in quel modo, perché ciò significherebbe un sacco di modifica del codice, poiché in precedenza l'array 2D passato a questa funzione veniva assegnato staticamente con le sue dimensioni note al momento della compilazione.

Quindi, come posso passare un array 2D a una funzione ed essere ancora in grado di usarlo come array 2D con 2 indici come il seguente?

arr[i][j]. 

Qualsiasi aiuto sarà apprezzato.

risposta

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); 
} 

Spero che questo è il modo in cui si desidera ....

+0

Questo è - anche se il codice ha lievi errori nel mem. allocare parte .. ma ottenuto il succo. – goldenmean

1

Non si può davvero fare questo senza modificare molto codice. Suggerisco di avvolgere questo in una struttura che contiene i limiti e quindi utilizzare regexp search'n'replace per correggere gli accessi.

Forse utilizzare una macro come AA(arr,i,j) (come in Accesso array) dove arr è la struttura.

+0

Quindi, fondamentalmente u dicono - nessun modo programmatico per farlo fare, ma 'di ricerca e sostituzione '. È corretto? – goldenmean

+0

Sì, questo è il senso. –

1

Per quanto ne so, tutto ciò che è possibile passare a una funzione è un puntatore al primo elemento di un array. Quando si passa una matrice reale a una funzione, si dice che "la matrice decade in un puntatore", quindi non rimane alcuna informazione sulla dimensione (o sulle dimensioni) della matrice puntata.

Un riferimento a un oggetto di tipo array-of-T che appare in un'espressione decade (con tre eccezioni) in un puntatore al suo primo elemento; il tipo del puntatore risultante è pointer-to-T.

Credo che si sarà in grado di trovare ulteriori informazioni su questo il C FAQ.

0

Numerical recipes in C (un libro che si occupa principalmente di matrici) suggerisce un modo per farlo in modo pulito e si occupano ancora di matrici 2D. Controlla la sezione 1.2 "Matrici e array 2D" e il metodo convert_matrix().

In sostanza ciò che è necessario è assegnare un set di puntatori a punti ai vettori di riga. E passa questo alla tua funzione insieme al numero di righe e colonne.

2

Se il compilatore supporta C99 lunghezza variabile-array allora si può dichiarare una funzione in questo modo (ad esempio GCC.):

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

Si potrebbe anche usare un puntatore a un tipo VLA nel codice chiamante:

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

Una matrice 2-in in C è solo una matrice di matrici.Qui 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

Aggiungi ulteriori informazioni su ciò che stai cercando di fare –