2015-04-01 49 views
0

我有一個程序將const int定義爲數組大小的值。無論如何,當程序第一次運行時,我可以改變這個var的值嗎?我只需要在開始時設定一次,但我不能讓程序編譯時試圖將其使用cin因爲我發現了一個錯誤,指出設置:在運行時讀入const int的值 - C++

​​

我的理解指的是存在沒有爲數組大小設置值,因此無法編譯。我也嘗試初始化var我想設置爲1,然後更改它,一旦程序正在運行,但我沒有這樣的運氣,得到相同的錯誤。

編輯: 前兩行是新的var和新的const int我期待改變,下面是錯誤似乎源於的行。

int objectIndexSize; 
const int numOfObjects = objectIndexSize; 
Mat imageArray[numOfObjects]; 
Mat descriptorsArray[numOfObjects]; 
vector<KeyPoint> keypointArray[numOfObjects]; 
String objectName[numOfObjects]; 
String fileNamePostCut[numOfObjects]; 
+0

您使用的數組索引不是整數或整數變量.....再次檢查 – ha9u63ar 2015-04-01 09:25:40

+3

將無法​​工作,禁止編譯器擴展。是否有一個原因,你不只是使用['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)? – Wintermute 2015-04-01 09:25:49

+1

你能顯示產生錯誤的代碼嗎?'const int s = 3;雙a [s]'通常很好。然而,如果你使用stl容器(例如std :: vector),你可以在這些問題上節省很多頭痛 – user463035818 2015-04-01 09:26:08

回答

0

變量如

int arr[10]; 

正在.data部分嵌入到你的可執行文件。你有40個字節的零。當您將可執行映像(.code.data等)加載到RAM中時,這40個字節將在那裏。不需要分配任何東西,因爲它已經由操作系統完成了。

(不知道如果是這樣的內存非常大的塊的情況下,由於內存可以被分割和可執行圖像不應該。也許編譯器的幕後一些神奇。)

無論如何,這就是爲什麼你不能這樣做

int n = 10; 
int arr[n]; 

但你可以做

const int n = 10; 
int arr[n]; 

的原因是因爲在第一種情況下編譯器不知道n是常量(可以通過優化計算出來,但是你明白了),而在第二種情況下,它永遠不會改變,這意味着編譯器知道要爲可執行文件預先分配多少內存。

現在,你顯然不能做const int a; std::cin >> a;,因爲這根本不是一個常數。

你可以做的是使用兩種:

int n; 
std::cin >> n; 
std::unique_ptr<int[]> arr(new int[n]); //C++11 
//or 
int *arr = new int[n]; //before C++11 

或使用矢量,並告訴它保留你會需要這樣的記憶:如果你知道

int n; 
std::cin >> n; 
std::vector<int> arr; 
arr.reserve(n); 

大小不會改變,你可能想使用指針而不是矢量。

2

您不能動態地在堆棧上分配數組。你應該改用std::vector

+0

使用矢量會有任何性能不足嗎? – Colin747 2015-04-01 09:26:56

+1

這取決於您計劃如何使用它。與動態分配數組相比,設置大小然後對其進行操作將產生非常小的開銷。 – TartanLlama 2015-04-01 09:28:53

+0

@ Colin747:比較可能的事物和不可能的事物之間的表現是毫無意義的。後者的表現無限糟糕。 – 2015-04-01 10:13:14