2017-02-20 5 views
1

정적 bool 배열이 제대로 초기화되지 않은 이유는 무엇입니까? 첫 번째 배열 만 초기화됩니다. 배열이 고정되어 있기 때문입니다.정적 Bool 배열 집합으로 초기화되지 않음

다음 MWE는 GCC로 컴파일되었으며 내 문제를 설명하기 위해 주 프로그램으로 전송 한 기능을 기반으로합니다. 나는 C++ 11을 사용하거나 사용하지 않으려 고 노력했다. 이 배열은 정적이며 true로 초기화 되었기 때문에 내 함수를 처음 입력 할 때 항상 인쇄해야한다는 것을 이해하고 있습니다. 따라서이 MWE에서는 한 번 인쇄해야합니다. arraysize 변수 1 다음 더 큰 경우가 array[size] = {true}을 사용하여 배열에만 첫번째 요소를 초기화하는

#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

는 다른 요소의 초기 값은 플랫폼에 의존한다. 나는 그것이 정의되지 않은 행동이라고 생각한다.

당신은 정말 대신 루프, 배열을 초기화하기 사용해야하는 경우 :

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

이것은 여러 번 호출되는 함수에서 사용하기위한 정적 변수이므로 루프를 사용할 수 없습니다.이 함수를 객체로 변환해야합니까? – user3235290

+1

예,이 기능을 개체로 유용하게 사용할 수 있습니다. 또는이 루프를 다른 함수로 옮기고 한 번 호출 할 수 있습니다 (예 : 프로그램 시작 부분). 정적 varaible을 너무 좋아한다면 정적 bool 플래그를 만들어서 배열을 다시 초기화 할 수 있습니다. –

+0

제안 해 주셔서 감사합니다. 저는 포인트 클라우드 라이브러리의 기능을 사용하여 좀 더 복잡한 스레딩 코드를 얻으려고 playinf입니다. 이런 이유로 나는 당신의 후자의 제안을 지금 취하여 당신의 이전 제안을 (객체로 바꾸는) 나중에 취할 것입니다. 고맙습니다! – user3235290

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

이 초기화를 첫 번째 진실은 진실이고 다른 모든 진실은 거짓이다. myIndex는 1이고, 어레이 인덱스가 0을 기준으로하기 때문에

if (firstCloudForThisClient[myIndex]) 

는이 거짓 인 엔트리를 액세스한다.

0

당신은 사용할 수 있도록 배열의 첫 번째 요소에 액세스해야합니다

const int myIndex = 0;