2012-04-06 29 views
3

我現在要做的是創建一個數組,其長度由變量定義。然而,當我把變量放在數組長度中時,它給了我一個「非POD元素類型'glm :: vec2'」錯誤的可變長度數組。但是,如果我用實際數字替換變量,則錯誤消失。爲什麼會發生這種情況,我該如何解決這個問題?無法設置變量的變量長度


int numtriangles = sector1.numtriangles; 


glm::vec2 tex[test]; //Using a variable generates an error 
glm::vec3 vertices[10]; //No error here 

+1

可變長度數組不是在C++支持。它只是一個編譯器擴展,如果它在其他平臺上編譯的話。 – Mahesh 2012-04-06 15:02:26

+0

[有沒有辦法用非常量變量初始化一個數組? (C++)](http://stackoverflow.com/questions/972705/is-there-a-way-to-initialize-an-array-with-non-constant-variables-c) – 2012-04-06 15:05:22

回答

7

不能有可變長度數組(VLA)在標準C++。
C++標準不允許使用變長數組。在C++中,數組的長度需要是編譯時間常量。一些編譯器支持VLA作爲編譯器擴展,但使用它們會使您的代碼在其他編譯器中不可移植。

您可以使用std::vector而不是VLA。

4

看到這個問題Is there a way to initialize an array with non-constant variables? (C++)

簡短的回答是不,你不能直接這樣做。然而,你可以得到的東西,如

int arraySize = 10; 
int * myArray = new int[arraySize]; 

現在myArray同樣的效果是一個指針數組,你可以像喜歡myArray[0]數組等

你也可以使用一個向量訪問這將允許你有一個可變長度的數組。我的例子允許你創建一個帶有變量initailizer的數組,然而在我的例子中,myArray只有10個項目。如果您不確定陣列使用矢量的時間有多長,並且您可以推送和放棄項目。

也請記住我的例子,因爲你已經dyanmically分配的內存,您將需要釋放內存當你在做類似

delete[] myArray; 

與陣列做這裏是一個小示例應用程序以說明這一點

#include <iostream> 
using namespace std; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int arraySize = 10; 
    int * myArray = new int[arraySize]; 
    myArray[0] = 1; 
    cout << myArray[0] << endl; 

    delete[] myArray; 
} 
+1

+1爲提高動態內存分配。首選方法是讓新手遠離動態內存分配,並使用'std :: vector'來代替。 – 2012-04-06 16:00:26

1

使用STL。 如果你想要一個可變長度的數組,你可以使用#include<vector>下的向量

原生C++數組donot nave可變長度數組。

0

當您聲明具有長度說明符的數組時,只允許使用常量。

事實上,當程序編譯時,數組長度被評估。

但是請注意,在C++中聲明int test[];是非法的,就像編譯器無法知道爲變量分配多少空間一樣。

沒有長度說明,有預留用於數組沒有實際的內存,你必須訴諸使用指針和動態內存分配:

int * test = new int[12]; 
// or 
int * test = new int[val]; // variable works here 

// and don't forget to free it 
delete [] test; 

使用int test[12]實際創建一個數組,它是靜態初始化一次,並在編譯時包含12個整數。 永遠不要試圖用delete [] test做這樣的變量聲明,因爲它肯定會讓你的程序崩潰。準確地說,如果在函數中聲明瞭該數組,則它將使用程序堆棧上的空間,並且如果在全局上下文中聲明,則將使用程序數據存儲器。

+0

第n次**指針和數組是不一樣的!**請停止傳播這個廢話! – 2012-04-06 15:15:20

+0

@Als「一個數組可以被認爲是一個常量指針」更好? (來自http://www.cplusplus.com/doc/tutorial/pointers/) – SirDarius 2012-04-06 15:23:38

+0

不,這是錯誤的,該特定的網站是臭名昭着的臭名昭着。好讀:[我如何使用C + +中的數組?](http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c) – 2012-04-06 15:27:36

0

C++不支持聲明可變長度數組。因此,要使用數組的長度可能會

  1. 假設 一個巨大的數字是你的陣列的最大可能的長度。現在聲明一個這樣大小的數組。並通過假設它是你想要的長度的數組來使用它。

    #define MAX_LENGTH 1000000000 
    glm::vec2 tex[MAX_LENGTH]; 
    

    迭代它

    for(i=0; i<test; i++) { 
        tex[i]; 
    } 
    

    注:內存使用也不會在這個方法最小化。

  2. 使用指針並根據您的長度進行分配。

    glm::vec2 *tex; 
    tex = new glm::vec2[test]; 
    

    輸入代碼在這裏

    for(i=0; i<test; i++) { 
        tex[i]; 
    } 
    delete [] tex; // deallocation 
    

    注:釋放的內存的兩倍會發生錯誤。

  3. 使用行爲與數組類似的其他數據結構。

    vector<glm::vec2> tex; 
    for(i=0; i<test; i++){ 
        tex.push_back(input_item); 
    } 
    /* test.size() return the current length */