2016-12-02 3 views
0

変数を使ってビットセットのサイズを設定する方法を知りたいと思います。たとえば、変数を使ってビットセットのサイズを設定する

// obtain file size: 
fseek (rFile , 0 , SEEK_END); 
numberOfBytes = ftell (rFile); 
rewind (rFile); 

const unsigned long long buffSize = numberOfBytes * 8; 
std::bitset<buffSize> buffer; 

バッファー定数の値が定数式で使用できないというエラーメッセージが表示されます。私は、現在読んでいるファイルのサイズにビットセットを設定する方法を探しています。

+3

テンプレートパラメータとして変数を使用することはできません。また、非const変数を使用してconst変数を初期化することもできません。それは残酷な世界ですが、あなたはそれを飲み込む必要があります。 –

+0

コンパイラは、定数値を指定しないとそのサイズをどのようにするのかを知っていますか?いくつかの標準ライブラリコンテナは、コンパイル後に任意にサイズ変更することができます。その違いを知るために、ドキュメントを注意深く読んでください。 – tadman

+0

あなたは 'std :: vector 'を使い果たすことができますか? –

答えて

5

できません。 std:bitsetのサイズはテンプレートパラメータなので、コンパイル時定数でなければなりません。 /仕事ができることができ

いくつかの選択肢は次のようになります。サイズの上限を設定し

  1. は、そのサイズのbitset使用し、ちょうど余分なビットを無視します。
  2. std::vector<bool>に切り替えます。これには注意点がありますが、bitsetとほぼ同じ基本機能を提供します。
  3. ブーストdynamic_bitsetに切り替えます。これにより、テンプレートパラメータではなくctorのパラメータとしてサイズを指定できるので、コンパイル時定数である必要はありません。

もちろん、他の可能性は間違いありません。個人的には、私の最初の選択はおそらくブーストdynamic_bitsetでしょう。

0

あなたができない、サイズがconst宣言された時定数と他のすべてをコンパイルし、定数の二つの異なる種類があります

3

コンパイル時に知られている必要があります。あなたのコードには後者があります。 constと宣言されていても、実行時まで分からないデータで初期化されるため、コンパイル時定数ではありません。

std::bitsetは、コンパイル時定数で定義する必要があります。あなたが持っていないので、コンパイラはあなたにエラーを与えます。実行時に定義されたビットセットが必要な場合は、boost::dynamic_bitsetを提案します。

関連する問題