2012-04-04 19 views
0

条件に応じてunsigned shortの配列を割り当てようとしています。条件に応じた配列サイズの割り当て

エラーC2057:私が遭遇する問題は、次の(以下のコードに応じて)である定数式が期待
エラーC2466:「パケット」:未知のサイズ

一定サイズ0
エラーC2133とアレイを割り当てることが不可能
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; 

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

+1

これらのifsに少し依存します。コンパイル時に評価できる場合は、テンプレートのメタプログラミングで長さを選択できます。 – visitor

+1

**なぜベクターを使用できないのですか? – delnan

+0

@delnan:私は考えている:Windowsでは、STLはDLLインタフェース上にあることは示唆されていない。 [これを見てください!](http://msdn.microsoft.com/en-us/library/3tdb471s%28v=vs.80%29.aspx) – Naszta

答えて

4

うん、動的に割り当てられた配列:

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

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

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

delete[] packet; 
+0

わかりました。その後、私はそれを使用した後にそれを削除する必要があります。なぜこのコードがLinux上で動作し、XP上のVisualでは動作しないのか分かりますか? – djfoxmccloud

+0

@visitor彼はベクトルを使うことはできませんが、それは質問に記載されています(あなたが全部を読んでいれば)。 –

+0

@djfoxmccloud gcc-extensionでなければなりませんが、標準ではありません。 –

-3

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

int * t = malloc(a * sizeof(int)) 
+1

(1) 'malloc'はC++では避けるべきです。 (2)あなたのスニペットは、 'void * 'に関するより厳しい型付けのためにC++で動作しません。 – delnan

+0

あなたはC++でnew演算子を使うことができます –

0

私は、メモリリークを回避するために、クラスにそれを取るでしょう:Cプログラマのための

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); 
+0

...基本的には貧弱な人の 'std :: vector'です。 – delnan

+0

@delman:それは本当です。しかし 'std :: vector'ではありません。 :) – Naszta

+0

真実ですが、あなたが私に尋ねるなら、それは賛成ではありません。なぜあなたはこの車輪を再発明しなければならないと思いますか? – delnan

-2

を:

//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; 
+0

CはC++ではありません。 Cで慣用的なことは、C++で有害であることはお勧めしません。また、あなたのコードはCでも悪いです(あなたはmallocの結果をキャストします)(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc))。 – delnan

0

Cスタイルの配列の要素数は整数でなければなりません定数 C++での式。 (C90はここでは定数式ではなく、 をサポートしていますが、私はこれに慣れていません)。明らかな答えは std::vectorですが、あなたはそれを使うことはできません。その場合、 はおそらく動的割り当てを使用できません。あなたは にあなたが最後に例外—を経由してスコープを残せば、あなたは遠く じゃない、あなたがそれで行われたときにdelete[]も 含めて、発生していることを確認していますが、それ以外の場合は、ポインタと new unsigned short[length/2]は、使用することができますローカルでstd::vectorの約半分を実装していない

あなたのコードの抽出物は、あまりにも単純化されていない場合は、次の理由だけ 最大の長さを確保していない、例えば:あなたの例では

unsigned short packet[8/2]; 

、最大length 8「であり、常に8 ISNのために予約何か問題を引き起こすだろう。 (実際length 等外部関数から来る値の多くを変えることができた場合に明らかに、この は現実的な解決策ではないかもしれない。しかし、それがあれば...複雑 を行うなぜあなたはシンプル行うことができますか?)

関連する問題