2010-10-16 68 views
7

Tôi làm cách nào để tôi có thể làm cho mã này hoạt động?Tham chiếu C++ mảng

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

Và đây là những lỗi mà tôi có:

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

Nhờ sự giúp đỡ

+0

C++ không có VLA. – kennytm

+0

YOu có thể sử dụng tiêu chuẩn :: vector –

Trả lời

19

Nếu bạn đang có ý định để vượt qua kích thước của mảng, sau đó loại bỏ các tài liệu tham khảo

void f(int a[]) 

tương đương với

void f(int* a) 

để không sao chép được thực hiện, nếu đó là mối quan tâm.

Nếu bạn muốn lấy mảng theo tham chiếu, thì bạn PHẢI chỉ định thứ nguyên. ví dụ.

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

Đương nhiên, tốt nhất của hai là giải pháp thứ ba, sử dụng std :: vectơ và truyền chúng theo tham chiếu, tham chiếu đến const hoặc theo giá trị nếu cần. HTH

+0

Đồng ý, chuyển một con trỏ tới mảng là cách để đi đến đây. – JeffW

+0

Ok thx để được trợ giúp nhưng tôi có thêm một câu hỏi trong tùy chọn thứ ba tôi có thể vượt qua tham số bằng cách sử dụng một biến? Nếu vậy làm thế nào sẽ trông gọi chức năng đó và nguyên mẫu của nó? – John

+0

@Artur: Xem câu trả lời của Prasson Saurav và nhận xét của tôi về nó. Hoặc bạn có nghĩa là của vector? Đối với véc tơ xem câu trả lời của Amardeep :) –

0

Mảng tham chiếu là bất hợp pháp, nếu đó là những gì bạn đang cố gắng làm. Nó không phải là 100% rõ ràng với tôi từ tiêu đề.

+0

virtual -1: Rõ ràng anh ta đang cố gắng tạo tham chiếu tới một mảng, không phải là mảng tham chiếu –

+0

@Armen - cú pháp là đủ lẫn lộn mà tôi không đồng ý một cách tôn trọng. Có khả năng câu trả lời của bạn là những gì anh ta cần. –

+0

@Steve: Nếu bạn nhìn vào mã (hãy để một mình cú pháp), nó là rất rõ ràng rằng ông đã không cố gắng để tạo ra một mảng tài liệu tham khảo –

5

Bạn không cần chỉ định kích thước của mảng nếu bạn tạo writeTable mẫu chức năng.

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

nhưng lưu ý rằng trong trường hợp này bạn sẽ không thể chuyển mảng được cấp phát động này chức năng. –

+2

@Armen: Có! Tại sao anh ta cần một mảng động được phân bổ anyway (anh ta sẽ sử dụng 'std :: vector')? –

+0

Nhận xét của tôi dành cho OP, chứ không phải bạn :) –

6

Đây là một C++ phong cách hơn một chút để làm việc đó:

#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, nhưng cách tiêu chuẩn/di động hơn là khai báo kiểu của tôi là vector :: size_type –

+0

@Armen: Tôi thường sử dụng size_t nhưng lười biếng được cài đặt. không biết vector <> :: size_type. Cảm ơn bạn về thông tin. –

+0

@Amardeep: Vâng, USUALLY vector :: size_type được nhập là size_t, lần lượt là USUALLY typedef'd as unsigned int. Nhưng không có bảo đảm –

1

Sau câu trả lời Amardeep của, đây là một cách C++ 11 để làm điều đó:

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

Lưu ý phạm vi dựa trên for được sử dụng trong writeTable.