2010-10-16 12 views
7

Ich frage mich, wie ich diesen Code arbeiten kann?C++ Referenzen 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; 
} 

Und hier sind die Fehler, die ich habe:

|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)’| 

Vielen Dank für Hilfe

+0

C++ hat kein VLA. – kennytm

+0

YOu könnte verwenden std :: vector –

Antwort

19

Wenn Sie die Größe des Arrays passieren, werden zu wollen, dann entfernen Sie den Verweis

void f(int a[]) 

entspricht

void f(int* a) 

so wird kein Kopieren gemacht, wenn das die Sorge ist.

Wenn Sie ein Array als Referenz verwenden möchten, müssen Sie die Dimension angeben. z.B.

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

natürlich das Beste aus den beiden ist die dritte Lösung, die std :: vector zu gebrauchen ist und geben sie Bezug genommen wird, Referenzwert const oder, wenn nötig. HTH

+0

Zustimmen, Übergabe in einem Zeiger auf das Array ist der Weg hierher zu gehen. – JeffW

+0

Ok thx für Hilfe, aber ich habe eine zusätzliche Frage in der dritten Option Ich kann Dimension mit einer Variablen übergeben? Wenn ja, wie würde diese Funktion und ihr Prototyp aussehen? – John

+0

@ Artur: Siehe Prasson Sauravs Antwort und mein Kommentar dazu. Oder meinst du den Vektor? Für Vektoren siehe Amardeeps Antwort :) –

0

Arrays von Referenzen sind illegal, wenn Sie das versuchen. Es ist mir nicht 100% klar aus dem Titel.

+0

virtual -1: Offensichtlich versucht er, einen Verweis auf ein Array zu erstellen, nicht ein Array von Referenzen –

+0

@Armen - die Syntax ist genug verwirrt, dass ich respektvoll nicht zustimmen. Es ist wahrscheinlich, dass Ihre Antwort ist, was er braucht. –

+0

@Steve: Wenn man sich den Code anschaut (geschweige denn die Syntax), ist es SEHR offensichtlich, dass er nicht versucht hat, ein Array von Referenzen zu erstellen –

5

Sie müssen die Dimension des Arrays nicht angeben, wenn Sie writeTable eine Funktionsvorlage erstellen.

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

aber nehmen Sie zur Kenntnis, dass in diesem Fall Sie nicht in der Lage sein werden, dynamisch zugewiesenen Arrays zu übergeben Funktion. –

+2

@Armen: Ja! Warum sollte er sowieso ein dynamisch zugewiesenes Array benötigen (er würde 'std :: vector' verwenden)? –

+0

Mein Kommentar war für die OP bestimmt, nicht Sie :) –

6

ist hier ein etwas C++ Stil, es zu tun:

#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, aber eine mehr Standard/portable Möglichkeit ist zu erklären, ich bin Typ als Vektor :: size_type –

+0

@Armen: Ich benutze in der Regel size_t aber Faulheit eingestellt. Ich warn Beachten Sie den Vektor <> :: size_type. Danke für die Information. –

+0

@Amarteep: Nun, USUALLY Vektor :: size_type ist typedef als size_t, die wiederum USUALLY typedef als unsigned Int. Aber es gibt keine Garantien –

1

Antwort Nach Amardeep, hier ist eine C++ 11 Art und Weise, es zu tun:

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

Notiere die Bereichsbasierte for verwendet in writeTable.