2010-11-02 14 views
9

Ho un piccolo problema con l'array 1D in C++. Io ho una linea funzione di questo:C++ dimensione dinamica dell'array

void func(int (&array)[???]) 
{ 
    // some math here; 

    "for" loop { 
     array[i] = something; 
    } 
} 

io chiamo le funzioni da qualche parte nel codice, e prima ho fatto la matematica non sono in grado di conoscere dimensione della matrice. L'array va alla funzione come riferimento !, perché ne ho bisogno nella funzione main(). Come posso allocare array come questo ?, quindi array con ?? la dimensione va alla funzione come riferimento, quindi devo mettere la dimensione e scrivere ad essa alcuni valori.

+5

Davvero la tua domanda non è chiara. Il problema è l'allocazione, l'accesso o come passare una matrice a una funzione?Si prega di mostrare un codice reale che illustra il problema, o descrivere ciò che si vuole effettivamente fare. –

+0

Una serie di riferimenti è una bestia insolita: probabilmente non si vogliono usare riferimenti come questo in ogni caso. –

+0

@Eamon: non è possibile avere una matrice di riferimenti, il codice precedente è un riferimento a una matrice. –

risposta

9

Utilizzare un puntatore, non un riferimento:

void func(int *a, int N); 

Oppure, più facile, utilizzare un vettore:

void func(std::vector<int> &a); 

vettori possono essere assegnati semplicemente dicendo

std::vector<int> a(10); 

Il numero degli elementi possono essere recuperati utilizzando a.size().

+0

Questo è tutto :) Grazie mille, Cordiali saluti! – nykon

14

Dato che si utilizza C++, perché non utilizzare uno std::vector<>?

+1

+1: per 'std :: vector'. – rubenvb

+0

+1 aggiuntivo per il vettore, io li uso sempre quando non so quanto sarà grande "qualcosa". –

+0

Pensi che la risposta sia utile per un principiante? –

10

Altri hanno detto che è necessario utilizzare std::vector in C++ e hanno ragione.

Ma è possibile rendere il proprio codice funzionante rendendo func un modello di funzione.

template <typename T, size_t N> 
void func(T (&array)[N]) 
{ 
    // some math here; 

    "for" loop { 
     array[i] = something; 
    } 
} 
+0

Il modo di funzionamento del modello è un primo esempio di: "come implementare funzionalità già presenti nella libreria standard" ... – rubenvb

+6

@rubenvb: cosa pensi che venga "implementato" qui? –

+5

Sono d'accordo con questi "dovresti usare un vettore"; OK; ma questa risposta fornisce un modo per risolvere e comprendere la domanda principale dell'OP ... –

5

Se la matrice si passa ad func è una pila di allineamenti, e non un puntatore, è possibile mantenere la sua dimensione utilizzando un modello di funzione:

template <class T, size_t N> 
void func(T(&array)[N]) 
{ 
    size_t array_length = N; // or just use N directly 
} 

int main() 
{ 
    int array[4]; 
    func(array); 
} 

Detto, come altri hanno già sottolineato out, std::vector è probabilmente la soluzione migliore qui.

+0

È interessante. – CiscoIPPhone

+0

ma non necessario, perché all'interno di func hai il parametro template N che contiene le stesse informazioni (come una costante temporale di compilazione). –

+0

@Fabio - giusto, notato. –

0

Oltre al vettore che è stato suggerito, è possibile utilizzare valarray, anch'esso parte di STL, destinato specificamente a gestire raccolte matematiche.

0

Quello che devi capire, è che gli array sono indicatori. Una definizione come int array[5] alloca lo spazio per 5 numeri interi nello stack e array sarà l'indirizzo del primo valore. Così, per accedere al primo valore nella matrice, è possibile scrivere

array[0] o *array (che è lo stesso come *(array + 0))

Allo stesso modo per recuperare l'indirizzo del terzo elemento, è possibile scrivere

&array[2] o array + 2

Dal array sono puntatori, è non devono preoccuparsi della dimensione del tempo di esecuzione del vostro array se si desidera passare a una funzione, è sufficiente passare come un puntatore:

void func(int *array) 
{ 
    int size; 
    //compute size of the array 
    for (int i = 0; i < size; ++i) 
    { 
     //do whatever you want with array[i] 
    } 
}