2012-04-02 73 views
5

Sto provando a passare un array (2d) a una funzione come parametro. Ho un codice come segue:Come passare un array bidimensionale a una funzione in C++

int main() 
{ 
    float T[100][100]; 
    void set_T(float T[][]); 
} 


void set_T(float T1[][]) 
{ 


    for (int i =0 ; i<90;i++) 
    { 
     for(int j =0 ;j <90;j++) 
     { 
      T1[i][j] = 3; 
     } 
    } 

} 

io non sono sicuro di come passare la matrice a una funzione ... sto ottenendo molti errori. Qualcuno può aiutare, per favore.

+0

possibile duplicato di [passaggio di matrice 2D a funzione] (http://stackoverflow.com/questions/8767166/passing-2d-array-to-function) – legends2k

risposta

-3

lo chiamano semplicemente così:

int main() 
{ 
    float T[100][100]; 
    set_T(T); 
} 

E come @suddnely_me detto, il tipo di T1 nella dichiarazione di funzione bisogno di essere float**.

+2

'float [] []' e 'float **' sono diversi. –

+0

@Jesse ha ragione. Un array 2D in stile C non è implementato come array di * puntatori * agli array. È una matrice di matrici, ovvero una prima riga di 100 elementi seguita dalla seconda riga di 100 elementi, ecc. Quindi per accedere correttamente a un array 2D usando la sintassi C, la funzione chiamata necessita di tutte le dimensioni tranne una da specificare. –

5
void set_T(float (&T)[100][100]); 
8

Ci sono due problemi qui:

  • C non supporta gli array 2D, solo array di array o array di puntatori ad array, nessuno dei quali è proprio la stessa cosa come una matrice 2D
  • C non consente agli array passanti di funzionare come argomenti, solo puntatori negli array (in generale, si utilizza un puntatore allo 0 ° elemento dell'array, poiché questo è ciò che il nome dell'array finisce per essere indicizzato da un puntatore simile a un altro accesso alla rete)

Quindi, a causa del primo problema, è necessario decidere come rappresentare un array 2D: una serie di array o una serie di puntatori agli array. Se si va il primo percorso, il codice finisce per assomigliare:

void set_T(float (*T1)[100]) { 
    ... do stuff with T1[i][j] ... 
} 

int main() { 
    float T[100][100]; 
    set_T(T); 
} 

Qui, hai dichiarato T ad essere un array di array di 100 100 carri, e set_T richiede un puntatore ad array di 100 carri come la sua argomentazione. Si passa 'T' direttamente a set_T, poiché la lingua tratta i nomi degli array come puntatori al loro 0 ° elemento.

Se invece si desidera utilizzare un array di puntatori ad array, si finisce con qualcosa di simile:

void set_T(float **T1) { 
    ... do stuff with T1[i][j] ... 
} 

int main() { 
    float *T[100]; 
    float space[100*100]; 
    for (int i = 0; i < 100; i++) 
     T[i] = space + i*100; 
    set_T(T); 
} 

Lo svantaggio è che è necessario allocare spazio per tutti gli array di secondo livello e inizializzare manualmente tutti i puntatori di primo livello per puntare su di essi. Il vantaggio è che le dimensioni degli array di secondo livello non fanno parte del tipo dell'argomento passato a set_T, quindi è possibile trattare più facilmente array di dimensioni variabili.

Ovviamente, se stai usando C++ e non C, non dovresti utilizzare affatto array C - dovresti utilizzare std::vector o std::array - entrambi che condividono solo il problema con l'array C 1D, quindi è necessario un vettore di vettori o una matrice di matrici (o presumibilmente un vettore di matrici o un array di vettori)

+0

Penso che la tua risposta potrebbe elencare alcune migliori alternative a 'float (*) [100]' o 'float **' per essere veramente completo. –

Problemi correlati