2014-03-02 2 views
0

는 내가 배열이 특정 값 비어 있는지 확인하려는 char[]선택하면

#define BUFFER_LENGTH 64  
#define QUEUE_LENGTH 100 
char MessageQueue[QUEUE_LENGTH][BUFFER_LENGTH]; 

로 구성된 각각의 메시지와 함께 메시지 큐 역할을하는 2 차원 배열을 가지고 첫 번째 차원에만 해당

for(int i = 0; i < sizeof(MessageQueue); i++) 
{ 
    if(MessageQueue[i] == 0) 
     MessageQueue[i][j] = ....; 
} 

그러나 비어있는 경우 if 문을 입력하지 않습니다.

+0

"비어 있음"을 정의 하시겠습니까? 여러분이 좋아하든 그렇지 않든, 그 것은'QUEUE_LENGTH * BUFFER_LENGTH' 문자를 차지하고,'MessageQueue [i]'는 그대로'0'을 선언하지 않을 것입니다. 그리고'sizeof (MessageQueue)'는 분명히 당신이 그 루프 톱 엔드에 사용하기를 원하지 않습니다. – WhozCraig

+1

첫 번째 차원의 값이 0이되지 않습니다. 다른 배열, 즉 2D로 정의했습니다. – Coderchu

+0

전체 차원이 0인지 확인해야합니다 (예 : 루프에서'MessageQueue [i] [0]'~'MessageQueue [i] [BUFFER_LENGTH-1]'모두가 0인지 확인하십시오.) –

답변

0

배열의 첫 번째 차원은 두 번째 차원으로 채워 지므로 0과 같을 수 없습니다. 두 번째 차원은 초기화되지 않았기 때문에 가비지가 포함될 수 있습니다. 당신은 배열이 비어 있는지 확인하려면

, 먼저 초기화 :

bool isEmpty(char * arr) 
{ 
    bool toReturn = true; 

    for (int i = 0; i < BUFFER_LENGTH && toReturn; i++) 
     toReturn = toReturn && 0 == arr[i]; 

    return toReturn; 
} 

사용 예 :

for (int i = 0; i < QUEUE_LENGTH; i++) 
    { 
     if (isEmpty(MessageQueue[i])) 
     { 
      // .... 
     } 
    } 
+0

"이 배열의 첫 번째 차원은 두 번째 차원 배열에 대한 포인터로 채워집니다. 배열에 포인터가 없습니다 . –

+0

은 '포인터'라는 단어를 '주소'로 변경했습니다 . – Omer

+0

배열은 주소를 저장하지 않습니다. 배열은 메모리의 한 범위입니다. –

1

for (int i = 0; i < QUEUE_LENGTH; i++) 
    for (int j = 0; j < BUFFER_LENGTH; j++) 
     MessageQueue[i][j] = 0; 

그런 다음 도우미 함수를 사용 제대로 이해했다면 배열에 메시지가 없는지 확인하고 싶습니다. 메시지가 문자열 리터럴로 저장된다고 가정합니다. 당신은

#include <iostream> 
#include <algorithm> 
#include <iterator> 

//... 

if (std::all_of(std::begin(MessageQueue), std::end(MessageQueue), 
        [](const char *s) { return (*s == '\0'); })) 
{ 
    std::cout << "The Message queue is empty" << std::endl; 
} 

처음에 배열이 0으로 초기화한다 고려 예를

를 들어 헤더 <algorithm>

에 선언 된 표준 알고리즘 std::all_of를 사용하여이 작업을 수행 할 수 있습니다. 예 :

char MessageQueue[QUEUE_LENGTH][BUFFER_LENGTH] = {}; 
+0

+1 for the ze ro 초기화. – Omer

1

치수가 비어 있는지 확인하려면 치수 내의 모든 요소를 ​​점검해야합니다. 이를 위해 간단한 for 루프를 사용할 수 있습니다.

그러나 게시 한 코드에 문제가 있습니다. 당신 for 루프에서 sizeof(MessageQueue)을 사용하면 QUEUE_LENGTH을 반환하지 않고 QUEUE_LENGTHBUFFER_LENGTH을 곱한 값으로 할당하지 않은 메모리에 액세스하게됩니다.

다음 코드는 원하는대로 할 것입니다.

//Note that sizeof(MessageQueue) has been changed to QUEUE_LENGTH. 
for(int i = 0; i < QUEUE_LENGTH; i++) 
{ 
    bool isEmpty = true; 
    for(int j = 0; j < BUFFER_LENGTH; j++) 
    { 
     if(MessageQueue[i][j] != 0) 
     { 
      isEmpty = false; 
      break; 
     }; 
    }; 
    if(isEmpty) 
    { 
     //DO SOME WORK. 

     //Exit the for-loop 
     break; 
    }; 
}; 

위의 코드는 차원이 비어 있는지 확인하지만 배열을 방금 만든 경우는 거의 없습니다. 이러한 이유 때문에 무엇인가를하기 전에 배열의 모든 요소를 ​​0으로 설정해야합니다. 이 작업은 다음 for 루프를 배치하여 수행 할 수 있습니다. 일부는 코드에서 배열에 액세스하기 전에 실행됩니다.

for(int i = 0; i < QUEUE_LENGTH; i++) 
{ 
    for(int j = 0; j < BUFFER_LENGTH; j++) 
    { 
     MessageQueue[i][j] = 0; 
    }; 
}; 

나는 같은 void InitMessageQueue() 다음은 단순히 프로그램의 초기화에서 그 함수를 호출하는 함수에서 루프이 배치 건의 할 것입니다.

+0

sizeof (MessageQueue)에 대한 좋은 지적 – Omer