2013-02-21 34 views
43

Tôi gặp vấn đề sau đây với mã của tôi:Array [n] vs Array [10] - Khởi tạo mảng với biến vs số thực

int n = 10; 
double tenorData[n] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

Trả về lỗi sau:

error: variable-sized object 'tenorData' may not be initialized 

Trong khi sử dụng double tenorData[10] hoạt động.

Bất cứ ai cũng biết tại sao?

+4

Nó sẽ giúp cung cấp một ngôn ngữ. Trong C++, mảng của bạn trong biểu mẫu đó cần phải có kích thước hằng số biên dịch. – OrangeAlmondSoap

+0

C++, sử dụng Codeblocks với trình biên dịch mingw32-g ++! – msmf14

+0

Cảm ơn, Justin và @AndrewVarnerin, đã giải quyết nó! thêm const trước int: const int n = 10; Giải quyết! – msmf14

Trả lời

106

Trong C++, mảng độ dài thay đổi không hợp pháp. G ++ cho phép này là một "mở rộng" (vì C cho phép nó), vì vậy trong G ++ (mà không bị -pedantic về sau chuẩn C++), bạn có thể làm:

int n = 10; 
double a[n]; // Legal in g++ (with extensions), illegal in proper C++ 

Nếu bạn muốn có một "mảng chiều dài thay đổi" (tốt hơn được gọi là một "động kích thước mảng" trong C++, vì mảng chiều dài thay đổi thích hợp không được phép), bạn có thể sở để tự động cấp phát bộ nhớ tự hỏi:

int n = 10; 
double* a = new double[n]; // Don't forget to delete [] a; when you're done! 

Hoặc tốt hơn nữa, sử dụng một container tiêu chuẩn:

int n = 10; 
std::vector<double> a(n); // Don't forget to #include <vector> 

Nếu bạn vẫn muốn có một mảng thích hợp, bạn có thể sử dụng một liên tục, không phải là một biến, khi tạo ra nó:

const int n = 10; 
double a[n]; // now valid, since n isn't a variable (it's a compile time constant) 

Tương tự như vậy, nếu bạn muốn để có được kích thước từ một hàm trong C + +11, bạn có thể sử dụng một số constexpr:

constexpr int n() 
{ 
    return 10; 
} 

double a[n()]; // n() is a compile time constant expression 
+1

Cảm ơn bạn, đây là một giải pháp tốt khác. Những gì tôi thực sự cần cuối cùng là một vector chứ không phải là một mảng! – msmf14

+0

@ msmf14: Vâng, các thùng chứa tiêu chuẩn, như 'vector', cực kỳ hữu ích. – Cornstalks

+0

Liệu các giải pháp vector khởi tạo mỗi phần tử khi bạn gọi "std :: vector <[một số lớp]> a (n);"? – Justin