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

4

5 に答える 5

7

標準 C++ では可変長配列 (VLA)を使用できません。
可変長配列は、C++ 標準では許可されていません。C++ では、配列の長さはコンパイル時の定数である必要があります。一部のコンパイラはコンパイラ拡張機能として VLA をサポートしていますが、それらを使用すると、他のコンパイラ間でコードを移植できなくなります。

std::vectorVLA の代わりに使用できます。

于 2012-04-06T15:01:50.510 に答える
4

この質問を参照してください非定数変数で配列を初期化する方法はありますか? (C++)

短い答えは、直接これを行うことはできません。ただし、次のようなものでも同じ効果を得ることができます

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

は配列へのポインタになり、 などmyArrayの配列のようにアクセスできます。myArray[0]

可変長配列を持つことを可能にするベクトルを使用することもできます。私の例では、変数の初期化子を使用して配列を作成できますが、myArray私の例では 10 項目しかありません。配列がどれくらい長くなるかわからない場合は、ベクターを使用して、アイテムをプッシュおよびポップすることができます。

また、私の例では、メモリを動的に割り当てたので、配列を使い終わったら、次のようにしてそのメモリを解放する必要があることに注意してください。

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;
}
于 2012-04-06T15:04:38.807 に答える
1

STL を使用します。可変長配列が必要な場合は、下でベクトルを使用できます#include<vector>

ネイティブ C++ 配列は、可変長配列ではありません。

于 2012-04-06T15:06:29.723 に答える
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
    

    注:メモリの解放を 2 回行うと、エラーが発生します。

  3. 配列のように動作する他のデータ構造を使用します。

    vector<glm::vec2> tex;
    for(i=0; i<test; i++){ 
        tex.push_back(input_item);
    }
    /* test.size() return the current length */
    
于 2012-04-06T15:36:29.683 に答える
0

長さ指定子を使用して配列を宣言する場合、定数のみが許可されます。

実際、配列の長さが評価されるのは、プログラムがコンパイルされるときです。

ただしint test[];、コンパイラが変数に割り当てるスペースを知る方法がないため、C++ で宣言することは違法であることに注意してください。

長さ指定子がない場合、配列用に予約されている実際のメモリはなく、ポインターと動的メモリ割り当てを使用する必要があります。

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でください。プログラムがクラッシュすることは間違いありません。

正確には、配列が関数で宣言されている場合はプログラム スタック上のスペースを使用し、グローバル コンテキストで宣言されている場合はプログラム データ メモリが使用されます。

于 2012-04-06T15:13:35.180 に答える