2010-08-24 3 views
7

in C++ voglio inizializzare una doppia matrice (2-dimensionale doppio array) come io normalmente fare senza puntatori in questo modo:C++ inizializzazione array multidimensionale

double data[4][4] = { 
    1,0,0,0, 
    0,1,0,0, 
    0,0,1,0, 
    0,0,0,1 
}; 

Tuttavia, poiché voglio tornare e passarlo a funzioni, ho bisogno di esso come un puntatore double**. Quindi, in pratica, ho bisogno di inizializzare i dati in un modo carino (come sopra), ma poi ho bisogno di salvare il puntatore sull'array 2D senza perdere i dati quando la funzione termina.

Qualsiasi aiuto su questo? :-)

+4

Perché avete bisogno come '' doppia **? Cosa c'è di sbagliato in un 'double (*) [4]'? –

+0

Questo è C++. Può essere una classe, con questo array come membro, che restituisce un riferimento quando si chiama una funzione membro? –

+0

possibile duplicato di [Passaggio di array bidimensionale tramite puntatore] (http: // stackoverflow.it/questions/3515045/passing-two-dimensional-array-via-pointer) È C, non C++, ma è esattamente lo stesso problema. –

risposta

9

A meno che non siete particolare circa puntatori, preferirei un riferimento qui

void init(double (&r)[4][4]){ 
    // do assignment 
    r[0][0] = 1; 
} 

int main(){ 
    double data[4][4] = { 
     1.0,0,0, 
     0,1,0,0, 
     0,0,1,0, 
     0,0,0,1 
    }; 

    init(data); 
} 

A proposito, se si passa ad una funzione in questo modo, si sarebbe "assegnare" piuttosto che "inizializzazione" .

+0

Penso che questa risposta si scaldi. Potrebbe essere quello che sto cercando! – Felix

+0

Sostituendo "init" con una funzione di copia, questo modello elegantemente il mio problema. Grazie! – Felix

1

Inizializza la variabile temporanea in questo modo e quindi la copia nella memoria allocata dinamicamente.

3

double (*)[4] è molto diverso da double **

Basta disegnare il layout delle raddoppia nella memoria per entrambi e si dovrebbe capire il motivo per cui non è possibile utilizzare in modo intercambiabile.

+0

poiché non conosco o capisco "double (*) [4]", non riesco a disegnarlo. Cosa significa? – Felix

+0

@Felix: Significa "puntatore a lunghezza-4 array di doppio". –

5

Tutte le tue matrici 4x4? Poi vorrei semplicemente definire una classe con un membro double[4][4] e passare gli oggetti di tale classe in giro:

class Matrix 
{ 
    double m[4][4]; 
    // ... 
}; 

void function(const Matrix& matrix) 
{ 
    // ... 
} 

Se avete bisogno di matrici di varie dimensioni, ma sono noti al momento della compilazione, utilizzare un modello:

template <size_t n> 
class Matrix 
{ 
    double m[n][n]; 
    // ... 
}; 

template <size_t n> 
void function(const Matrix<n,n>& matrix) 
{ 
    // ... 
} 

Ciò consente di evitare il deterioramento da matrice a puntatore e rende il codice più leggibile IMHO.

4

In primo luogo, la dichiarazione della matrice bidimensionale non è corretta. Essa deve essere fatto nel modo seguente:

double data[4][4] = { 
     {1.0,0,0,0}, 
     {0,1,0,0}, 
     {0,0,1,0}, 
     {0,0,0,1} 
    }; 

In secondo luogo, per il passaggio in una funzione si può fare come

show(data); 

Nella dichiarazione di funzione, è necessario dare l'argomento come una matrice con dando tutte le dimensioni tranne la prima. Quindi la dichiarazione dovrebbe essere:

void show(double arr[][4]) 
{ 
    ... 
    ... 
} 

Questo passa l'array come riferimento senza che sia necessario utilizzare un puntatore.

Spero che questo abbia aiutato.

+0

Grazie! L'inizializzazione di una riga era ciò che stavo cercando. –

0

ne dite di questo (con puntatori, e fa quello che hai chiesto)

#include <iostream> 

using namespace std; 

int refer(double (*a)[4]) 
{ 
    cout<<"First value is "<<(*a)[0]; 
    (*a)[0] = 37; 
    cout<<"changed value is "<<(*a)[0]; 
} 

int main() 
{ 
    double data[4][4] = { 
    1.0,0,0, 
    0,1,0,0, 
    0,0,1,0, 
    0,0,0,1 
    }; 
    refer(data); 
    return 0; 
}