2010-10-16 6 views
7

I ferito come posso far funzionare questo codice?C++ reference array

#include <iostream> 
using namespace std; 

void writeTable(int (&tab)[],int x){ 
    for(int i=0;i<x;i++){ 
     cout << "Enter value " << i+1 <<endl; 
     cin >> tab[i] ; 
    } 
} 


int main(void){ 
    int howMany; 
    cout << "How many elemets" << endl; 
    cin >> howMany; 

    int table[howMany]; 
    int (&ref)[howMany]=table; 
    writeTable(ref,howMany); 
    return 0; 
} 

e qui ci sono gli errori che ho:

|4|error: parameter ‘tab’ includes reference to array of unknown bound ‘int []’| 
|18|error: invalid initialization of reference of type ‘int (&)[]’ from expression of type ‘int [(((unsigned int)(((int)howMany) + -0x00000000000000001)) + 1)]’| 
|4|error: in passing argument 1 of ‘void writeTable(int (&)[], int)’| 

Grazie per l'aiuto

+0

C++ non ha VLA. – kennytm

+0

Potresti usare std :: vector –

risposta

19

Se avete intenzione di passare la dimensione della matrice, quindi rimuovere il riferimento

void f(int a[]) 

è equivalente a

void f(int* a) 

quindi non verrà eseguita alcuna copia, se questo è il problema.

Se si desidera prendere un array per riferimento, è necessario specificare la dimensione. per esempio.

void f(int (&a)[10]) 

Naturalmente, la migliore dei due è la terza soluzione, che è quella di utilizzare std :: vector e di passarli per riferimento, riferimento a const o valore se necessario. HTH

+0

Accetto, passare un puntatore alla matrice è la strada da percorrere qui. – JeffW

+0

Ok per aiuto, ma ho una domanda aggiuntiva nella terza opzione Posso passare la dimensione usando una variabile? Se sì, come sembrerebbe chiamare questa funzione ed è un prototipo? – John

+0

@Artur: Vedi la risposta di Prasson Saurav e il mio commento. O intendi il vettore? Per il vettore vedere la risposta di Amardeep :) –

0

Le matrici di riferimenti sono illegali, se è ciò che si sta tentando di fare. Non mi è chiaro al 100% dal titolo.

+0

virtuale -1: Ovviamente sta tentando di creare un riferimento a un array, non a un array di riferimenti –

+0

@Armen - la sintassi è abbastanza confusa da non essere rispettosamente rispettoso. È probabile che la tua risposta sia ciò di cui ha bisogno. –

+0

@Steve: Se si guarda il codice (per non parlare della sintassi), è MOLTO ovvio che non stava provando a creare una serie di riferimenti –

5

Non è necessario specificare la dimensione della matrice se si rende writeTable un modello di funzione.

template <typename T,size_t N> 
void writeTable(T (&tab)[N]) //Template argument deduction 
{ 
    for(int i=0 ; i<N ; i++){ 
     // code .... 
    } 
} 

.

int table[howMany]; // C++ doesn't have Variable Length Arrays. `howMany` must be a constant 
writeTable(table); // type and size of `table` is automatically deduced 
+1

ma attenzione che in questo caso non sarai in grado di passare array allocati dinamicamente a questo funzione. –

+2

@Armen: Sì! Perché avrebbe comunque bisogno di un array allocato dinamicamente (userebbe 'std :: vector')? –

+0

Il mio commento era inteso per l'OP, non tu :) –

6

Ecco un C stile un po 'più ++ di farlo:

#include <iostream> 
#include <vector> 

void writeTable(std::vector<int> &tab) 
{ 
    int val; 

    for (unsigned int i=0; i<tab.size(); i++) 
    { 
     std::cout << "Enter value " << i+1 << std::endl; 
     if (std::cin >> val) 
     { 
      tab[i] = val; 
     } 
    } 
} 


int main() 
{ 
    int howMany; 
    std::cout << "How many elements?" << std::endl; 
    std::cin >> howMany; 

    std::vector<int> table(howMany); 
    writeTable(table); 

    return 0; 
} 
+0

+1, ma un modo più standard/portatile è quello di dichiarare il tuo tipo come vettore :: size_type –

+0

@Armen: di solito uso size_t ma la pigrizia è impostata su. I wasn Conosciamo il vettore <> :: size_type. Grazie per le informazioni. –

+0

@Amardeep: Beh, USULTAMENTE vector :: size_type è typedef'd come size_t, che a sua volta è tipicamente utilizzato come unsigned int. Ma non ci sono garanzie –

1

seguito la risposta di Amardeep, ecco un modo C++ 11 per farlo:

#include <iostream> 
#include <vector> 

void writeTable(std::vector<int> &tab) 
{ 
    int val; 

    for (auto& cell : tab) 
    { 
     std::cout << "Enter value " << i+1 << std::endl; 
     if (std::cin >> val) 
     { 
      cell = val; 
     } 
    } 
} 


int main() 
{ 
    int howMany; 
    std::cout << "How many elements?" << std::endl; 
    std::cin >> howMany; 

    std::vector<int> table(howMany); 
    writeTable(table); 

    return 0; 
} 

Nota del for basato su intervallo utilizzato in writeTable.