2010-11-02 75 views
9

Tôi gặp vấn đề nhỏ với mảng 1D trong C++. Tôi có một đường dây chức năng này:kích thước động C++ của mảng

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

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

Tôi gọi hàm ở đâu đó trong mã và trước khi tôi thực hiện toán, tôi không thể biết thứ nguyên của mảng. Mảng đi đến hàm như một tham chiếu !, bởi vì tôi cần nó trong hàm main(). Làm thế nào tôi có thể phân bổ mảng như thế này ?, Vì vậy, mảng với ?? kích thước đi đến hàm như tham chiếu sau đó tôi phải đặt kích thước và viết cho nó một số giá trị.

+5

Thực sự câu hỏi của bạn không rõ ràng chút nào. Là vấn đề của bạn phân bổ, truy cập hoặc làm thế nào để vượt qua một mảng đến một chức năng?Vui lòng hiển thị một số mã thực tế minh họa sự cố của bạn hoặc mô tả những gì bạn thực sự muốn làm. –

+0

Một mảng tham chiếu là một con thú khác thường: có thể bạn không muốn sử dụng các tham chiếu như thế. –

+0

@Eamon: Bạn không thể có một mảng tham chiếu, mã ở trên là tham chiếu đến một mảng. –

Trả lời

9

Sử dụng một con trỏ, không phải là một tài liệu tham khảo:

void func(int *a, int N); 

Hoặc, dễ dàng hơn, sử dụng một vector:

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

Vectors thể được phân bổ bằng cách đơn giản nói

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

Số các phần tử có thể được truy xuất bằng cách sử dụng a.size().

+0

Đó là nó :) cảm ơn bạn rất nhiều, Trân trọng! – nykon

14

Vì bạn đang sử dụng C++, tại sao không sử dụng std::vector<> thay thế?

+1

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

+0

+1 bổ sung cho véc tơ, tôi thường xuyên sử dụng chúng bất cứ lúc nào tôi không biết mức độ lớn của "thứ gì đó" sẽ như thế nào. –

+0

Bạn có nghĩ câu trả lời là hữu ích cho người mới bắt đầu không? –

10

Khác đã đề cập rằng bạn nên sử dụng std::vector trong C++ và chúng đúng.

Nhưng bạn có thể làm cho mã của mình hoạt động bằng cách tạo func mẫu chức năng.

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

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

Cách hàm mẫu là một ví dụ chính về: "cách triển khai chức năng đã có trong Thư viện chuẩn" ... – rubenvb

+6

@rubenvb: Bạn nghĩ gì đang được "triển khai" ở đây? –

+5

Tôi đồng ý với những "bạn nên sử dụng một vectơ"; ĐƯỢC; nhưng câu trả lời này cung cấp một cách để giải quyết và hiểu câu hỏi chính của OP ... –

5

Nếu mảng bạn vượt qua để func là một mảng ngăn xếp, và không phải là một con trỏ, bạn có thể giữ lại kích thước của nó bằng cách sử dụng một hàm template:

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

Điều đó nói rằng, như những người khác đã chỉ ra, std::vector có lẽ là giải pháp tốt nhất ở đây.

+0

Điều đó thật thú vị. – CiscoIPPhone

+0

nhưng không cần thiết, bởi vì bên trong func bạn có tham số mẫu N chứa thông tin giống nhau (dưới dạng hằng số thời gian biên dịch). –

+0

@Fabio - đúng, lưu ý. –

0

Cũng như vectơ đã được đề xuất, bạn có thể sử dụng valarray cũng là một phần của STL và được thiết kế đặc biệt để xử lý các bộ sưu tập toán học.

0

Điều bạn phải nhận ra, đó là các mảng là con trỏ. Định nghĩa như int array[5] sẽ phân bổ không gian cho 5 số nguyên trên ngăn xếp và array sẽ là địa chỉ của giá trị đầu tiên. Vì vậy, để truy cập vào các giá trị đầu tiên trong mảng, bạn có thể viết

array[0] hay *array (mà cũng giống như *(array + 0))

Trong cùng một cách để lấy địa chỉ của phần tử thứ ba, bạn có thể viết

&array[2] hoặc array + 2

Kể từ khi mảng được gợi ý, bạn không phải lo lắng về kích thước thời gian chạy của mảng của bạn nếu bạn muốn vượt qua nó để một chức năng, chỉ cần vượt qua nó như một con trỏ:

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] 
    } 
}

Các vấn đề liên quan