2017-02-20 8 views
1

静的なboolの配列が正しく初期化されないのはなぜですか?最初のものだけが初期化されます - これはアレイが静的であるためです。スタティックブール配列セットとして初期化されない

次のMWEはGCCでコンパイルされ、自分の問題を説明するためにメインプログラムに移行したことを私が書いている機能に基づいています。私はC++ 11を使ってみました。私の理解は、この配列は静的で、trueに初期化されているため、これは私が自分の関数を初めて入力するときに常に出力されるべきだからです。したがって、このMWEでは一度印刷する必要があります。

#include <iostream> 

using namespace std; 

const int arraysize = 10; 
const int myIndex = 1; 

static bool firstTimeOverall = true; 

int main() 
{ 
    static bool firstCloudForThisClient[arraysize] = {true}; 
    cout.flush(); 
    if (firstCloudForThisClient[myIndex]) 
    { 
     cout << "I never get here" << endl; 
     firstCloudForThisClient[myIndex] = false; 
     if (firstTimeOverall) 
     { 
      firstTimeOverall = false; 
      cout << "But think I would get here if I got in above" << endl; 
     } 
    } 
    return 0; 
} 
+1

あなたは 'firstCloudForThisClient'のすべての要素が' true'に初期化されていると思いますか? – quamrana

答えて

1

あなたは、デフォルトの初期化を活用するためにあなたの条件を反転する必要がある場合があります

#include <iostream> 

using namespace std; 

const int arraysize = 10; 
const int myIndex = 1; // note this index does not access the first element of arrays 

static bool firstTimeOverall = true; 

int main() 
{ 
    static bool firstCloudForThisClient[arraysize] = {}; // default initialise 
    cout.flush(); 
    if (!firstCloudForThisClient[myIndex]) 
    { 
     cout << "I never get here" << endl; 
     firstCloudForThisClient[myIndex] = true; // Mark used indexes with true 
     if (firstTimeOverall) 
     { 
      firstTimeOverall = false; 
      cout << "But think I would get here if I got in above" << endl; 
     } 
    } 
    return 0; 
} 
0

あなたはARRAYSIZE変数が1次に大きい場合、他の要素の初期値は、プラットフォームに依存し、array[size] = {true}を使用してアレイ上の最初の要素だけを初期化しています。私はそれが未定義の行動だと思う。

あなたは本当に代わりにループを使用して、あなたの配列を初期化する必要がある場合:

for(int i=0; i < arraysize; ++i) 
firstCloudForThisClient[i] = true; 
+0

これは複数回呼び出される関数で使用するための静的変数なので、ループを使用することはできません。つまり、この関数をオブジェクトに変換する必要がありますか? – user3235290

+1

はい、この機能をオブジェクトにすると便利です。または、このループを他の関数に移動して、たとえばプログラムの先頭などで一度呼び出すこともできます。静的なものがあまりにも好きであれば、静的なブールフラグを作成することもできます。これは、配列を再度初期化することを防ぎます。 –

+0

提案していただきありがとうございます。私は、ポイントクラウドライブラリの機能を使って、より複雑なスレッディングコードを取得しようとしています。この理由から私はあなたの後の提案を今のところ受け取り、後でそれをオブジェクトに変えるというあなたの以前の提案をします。ありがとうございました! – user3235290

1
static bool firstCloudForThisClient[arraysize] = {true}; 

これは初期化最初のエントリはtrue、それ以外はfalseです。

if (firstCloudForThisClient[myIndex]) 

myIndex 1と配列のインデックスは、ゼロベースであるので、これは偽であるエントリにアクセスします。

0

あなたは使用ので、配列の最初の要素にアクセスする必要があります。

const int myIndex = 0; 
関連する問題