0

私はC++を初めて使用します。一定の長さのconst配列が欲しいのですが。これはかなり長い配列であるため、定数配列を初期化するための標準的な方法、つまり次のようになります。

const bool some_array[] = {true, false, true};

実用的ではありません。ブール値の定数配列を初期化したいのですが。私はそれを次のように実装しようとしました:

bool* sieve_of_eratosthenes(bool* n, n_length);

int main(){
    bool b[500];
    bool primeList[] = {sieve_of_eratosthenes(b, 500)};
}

これはほとんど機能しますが、あまりエレガントでもスペース効率も良くありません(この配列をどのように実装するかについてのコメントを受け付けています)。問題は、s_of_e()関数によって返されるブール配列の0番目の要素をfalse / zeroに明示的に設定したにもかかわらず、返される配列の0番目の要素(primeList)がtrue/1に設定されることです。

primeList[0] == 1

いつあるべきか:

primeList[0] == 0

0はプライムではないので...

なぜそれがこれをしているのかについて誰かが私に教えてもらえますか?

4

3 に答える 3

3
bool primeList[] = {sieve_of_eratosthenes(b, 500)};

これはあなたが思っているようには機能しません。組み込み型はすべてに変換可能でbool、0(もちろんNULLを含む)はfalseに変換され、それ以外はtrueに変換されます。NULL以外のポインタを返すため、配列の最初の要素がtrueに設定されている場合に発生します。サイズを明示的に指定せず、初期化子を1つだけ指定したため、配列の長さは1要素です。

于 2012-09-22T19:09:23.980 に答える
1

あなたのコード、

bool* sieve_of_eratosthenes(bool* n, n_length);

int main(){
    bool b[500];
    bool primeList[] = {sieve_of_eratosthenes(b, 500)};
}

動作しないので

  • 関数は配列ではなくポインタを返し、

  • 関数が配列への参照を返したとしても、それは初期化子リストでの使用時にポインターに崩壊します。

(また、暗黙的intはC ++の一部ではなかったため、コンパイルしないでください。)

ポインタはに変換されbool、それが配列が取得する唯一の要素です。

代わりに、これを行います。

#include <vector>
using namespace std;

vector<bool> sieve_of_eratosthenes( int const n_length )
{
    // Code here.
}

int main()
{
    std::vector<bool> const primeList = sieve_of_eratosthenes( 500 );
}

ただし、これstd::vectorは要素のケースを最適化するように設計されてboolおり、通常のC++実装では要素ごとに1ビットしか使用しないことに注意してください。

これは、見方によっては、機能または設計レベルのバグと見なすことができます。

于 2012-09-22T19:35:02.277 に答える
0

配列とポインタは別のものです。配列を作成していますが、最初の要素の初期化リストでポインターを使用しています。ポインタはに変換されbool、nullポインタではないため、になりtrueます。

于 2012-09-22T19:08:16.997 に答える