2011-12-08 9 views
2

私は実行時までサイズを知っていない配列を持っています。プログラムが開始され、サイズが計算されると、サイズは変更されません。変数をconstに変換します

私は、次のコードをテストした:num_elementsが計算されるので、次のコードは動作しません

#include <iostream> 
#include <boost/array.hpp> 
#include <cstdint> 

int main() 
{ 

    uint32_t num_bits = 12; 
    const uint32_t num_elements = 1 << num_bits; 

    boost::array<double, num_elements > myArray; //does not work 

    return 0; 

} 

を。私は "const_cast"オプションがあることがわかりましたが、私の問題を解決するかどうかはわかりません。

boost :: arrayを使用したいので、私はブーストソリューションがあるかどうかを知りたいと思います。 num_bits

EDITは、私はまた、ファイルからの実行時間の前に未知のこの平均値を読み出したパラメータです。私は、std :: vectorを使用してソリューションを認識していますが、アクセス速度も重要です。これらの要素に頻繁にアクセスし、シミュレーションには約3日かかります...現時点では、私は単純に配列を使用します(新規および削除)

+0

動的サイズの配列をスタックに配置することはできません。あなたは 'array ' edit:nvm boost :: arrayはサイズが動的ではありません。 – PeterT

+1

@PeterT 'alloca'はダイナミックなスタック割り当てですC99スタイルのVLAsもサポートしています – Pubby

+0

' std :: vector'は 'new' /' delete'よりも速くなくても一般的に高速です(ライブラリの実装とコンパイラオプティマイザが一緒に動作してエイリアシングを解消すると高速になることがありますが、これは非常にまれです)。 – MSalters

答えて

4

ブースト配列は、コンパイル時にサイズがわかっている配列用です。その引数は定数式でなければなりません。

std :: vectorなどのコンテナを使用します。

あなたの例では、実行時に計算する必要はありませんが:

const uint32_t num_bits = 12; // mark this const too 
const uint32_t num_elements = 1 << num_bits; 

boost::array<double, num_elements > myArray; 
+0

thanksあなたの答えは、残念ながら、実行前にnum_bitsも知られていません – Eagle

+0

これは最も正しい答えです:正式には、テンプレート引数は_Integral Constant Expressions_でなければなりません。動作しません。 – MSalters

4

はあなたがstd::vectorの代わりboost::array使用することはできませんか? std::vectorのサイズは、実行時に計算することができます。

const_castのみも実行時にconstから/へ変数を変換し、たいboost::array(及び新しいC++ 11 std::array)、コンパイル時定数を作成するために使用することができません。

0

templateへの引数は、コンパイル時定数(または型)でなければなりません。サイズはその後、動的に割り当てられた配列やstd::vectorを使用し、コンパイル時に知られていない場合は

boost::array<double, (1 << num_bits)> myArray; //ok 

:あなたはコンパイル時にnum_bitsを知っていれば、それにとしてコンパイル時の定数を使用します。

関連する問題