0

条件に応じて unsigned short の配列を割り当てようとしています。私が遭遇する問題は次のとおりです(以下のコードによると):

エラー C2057: 定数式が必要です
エラー C2466: 定数サイズ 0 の配列を割り当てることはできません
エラー C2133: 'packet': 不明なサイズ

unsigned int length=4;
if(...)
{
    length = 8;
}
else if(...)
{
    length = 6;
}
else
{
    length = 4;
}

unsigned short packet[length/2];

配列宣言の前にこれを追加して配列サイズに使用するなど、いくつかの悪ふざけを試みましたが、うまくいきません。

const unsigned int halfLength=length/2;

ベクトルを使用して配列を置き換えることはできません。何か考えはありますか?

4

5 に答える 5

4

はい、動的に割り当てられた配列:

unsigned short* packet = new unsigned short[length/2];

実行時に自動ストレージ割り当て配列のサイズを指定することはできません。

また、メモリを自分で解放する必要があります。

delete[] packet;
于 2012-04-04T09:04:17.600 に答える
0

メモリリークを回避するために、クラスに持っていきます。

template <class T1> class array
{
public:
  array( size_t size )
    : addr(0)
  {
    if ( size > 0 )
      this->addr = new T1[size];
  };
  ~array( void )
  {
    if ( this->addr != 0 )
    {
      delete [] this->addr;
      this->addr = 0;
    }
  };
  T1 & operator[]( size_t index )
  {
    return this->addr[index];
  };
  bool empty( void ) { return (this->addr != 0); };
private:
  T1 * addr;
};

array<unsigned short> packet(length/2);
于 2012-04-04T09:14:57.600 に答える
0

C スタイル配列の要素数は、C++ の整数定数式でなければなりません。(C90 はここで非定数式をサポートしていますが、私はそれに慣れていません。) 明白な答えは ですが std::vector、あなたはそれを使用できないと言います。その場合、おそらく動的割り当ても使用できません。それ以外の場合は、ポインター and new unsigned short[length / 2]を使用できますがdelete[]、例外を介してスコープを離れる場合を含め、それを使用したときに a も発生することを確認する必要があります。std::vectorローカル。

コードの抜粋があまり単純化されていない場合: 最大長を予約しない理由は次のとおりです。

unsigned short packet[8 / 2];

あなたの例では、最大lengthは 8 であり、常に 8 を予約しても問題は発生しません。(明らかに、外部関数などからの値によって実際のlength 値がさらに変化する可能性がある場合、これは現実的な解決策ではない可能性があります。しかし、そうである場合は...簡単にできるのになぜ複雑にするのですか?)

于 2012-04-04T09:18:23.307 に答える
-2

cプログラマーの場合:

//length value is dynamically assigned
int length=10;

//runtime allocation
unsigned short * f = (unsigned short *) malloc (length/2 * sizeof(unsigned short));

//use the vector
f[0]=1;

...

//free the memory once the program does not need more
free(f);
f=NULL;
于 2012-04-04T09:15:29.690 に答える
-3

配列のサイズを動的に割り当てることはできません。配列の動的サイズを割り当てるためにポインターを使用できます。

int * t = malloc(a * sizeof(int))
于 2012-04-04T09:06:15.417 に答える