2017-02-20 44 views
1

Почему мой массив статических bools не инициализирован правильно? Только первый инициализирован - я подозреваю, что это потому, что массив статичен.Static Bool Array Не инициализируется как установлено

Следующие 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

Ваши инициализируют только первый элемент в массиве с использованием array[size] = {true}, если ArraySize переменного больше, то 1, начальное значение других элементов зависит от платформы. Я думаю, что это неопределенное поведение.

Если вам действительно нужно инициализировать ваш массив, используйте цикл вместо:

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

Поскольку это статическая переменная для использования в функции, которая называется несколько раз, я не могу использовать цикл - значит ли это, что я должен превратить эту функцию в объект? – user3235290

+1

Да, может быть полезно включить эту функцию в объект. Или вы можете переместить этот цикл в другую функцию и вызвать его один раз, например, в начале программы. Если вам так нравится статический varaible, вы даже создаете статический флаг bool, который снова защитит вас от инициализации массива. –

+0

Благодарим вас за предложение - я пытаюсь получить более сложный код потока, работающий с функциональностью из облачной библиотеки точек. По этой причине я возьму ваше последнее предложение на данный момент и возьму ваше прежнее предложение (превратив его в объект) позже. Спасибо! – user3235290

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

Это инициализирует первая запись в true, а все остальные - false.

if (firstCloudForThisClient[myIndex]) 

Однако, поскольку myIndex равно 1 и индексация массивов начинается с нуля, это обращается к второй вход, который является ложным.

0

Вы должны получить доступ к первому элементу массива, так что используйте:

const int myIndex = 0;