다중if문 구조의 최소화 할려면 어떻게 해야하는지 조언 좀 부탁드립니다.
글쓴이: bongpjh / 작성시간: 목, 2013/10/10 - 9:46오전
배열의 공간은 2048개의 unsigned char로 할당 되어 있습니다.
일차원배열 공간에 노이즈신호가 유입이 됨으로써 이 노이즈신호를 제거해고자 다중if문으로 처리하였는데 효율성도 없을 뿐더러 코드 읽었을떄 복잡함이 있습니다.
예를들어 아래와 같이 경우의 수가 몇가지 있습니다. 이런것을 조금 원만하게 코드를 짤 방법은 없나요?
경우의 수[1] = 255,255,255,0,255,255 배열[3] - > 255로 변경이 되어야 한다.
경우의 수[2] = 255,255,255,0,0,255,255 배열[3],배열[4] - > 255로 변경이 되어야 한다.
경우의 수[3] = 0,0,255,0,0,0,0 배열[2] - > 0 로 변경이 되어야 한다.
경우의 수[4] = 0,0,255,255,0,0,0 배열[2], 배열[3] - > 0 로 변경이 되어야 한다.
if(Camera_InBuffer[i-1]==255 && Camera_InBuffer[i-2]==255)
{
if(Camera_InBuffer[i+1]==255 && Camera_InBuffer[i]==0)
{
Camera_InBuffer[i]=255;
}
}
if(Camera_InBuffer[i-1]==0 && Camera_InBuffer[i-2]==0)
{
if(Camera_InBuffer[i+1]==0 && Camera_InBuffer[i]==255 )
{
Camera_InBuffer[i]=0;
}
}
if((Camera_InBuffer[i-1]==255 && Camera_InBuffer[i-2]==255 ))
{
if(Camera_InBuffer[i]==0 && Camera_InBuffer[i+1]==0)
{
if(Camera_InBuffer[i+2]==255 && Camera_InBuffer[i+3]==255)
{
Camera_InBuffer[i] = 255;
Camera_InBuffer[i+1] =255;
}
}
}Forums:


작성하신 코드대로라면..
255,0,255,0,255,0,255,255 가 되어버리는 경우라면 배열안의 모든 값의 갯수만큼 if문이 생겨야 오류가 없을것 같습니다.
하나의 스테이터스 값(?)을 이용해보는게 어떠실런지 생각합니다. STATUS=0; 에서 출발하여 255값일 경우 +1, 0일경우 -1을 하여 최종적으로 나오는 STATUS값이 0 초과일때는 전체 배열을 255로, 0 미만일때는 0으로 초기화 하면 될것 같습니다.
배열의 값이 255, 0, 255, 0, 255, 255, 0, 255, 0, 0, 255 일 경우,
STATUS의 값은 1, 0, 1, 0, 1, 2, 1, 2, 1, 0, 1 이 되어 최종적으로 1이라는 0 초과의 값이 나오기 때문에 전체 배열을 255로 초기화하는..
명령어의 내부 동작이 어떻게 되는지는 몰라서 더 효율적인 방법은 생각나지 않지만, if문의 중첩보다는 빠를것 같습니다.
감사합니다.
답변 감사합니다.
현재 morolty님께서 알려주신 방법대로 했는데 정상적으로 잘 됩니다. 또 한번 감사드립니다.
한가지만 더 여쭈어보겠습니다. 배열값이 2048개인데 이 전체 배열을 status 음수 양수가 아닌 배열 2048개를 5개씩 순차적으로 비교하게 할 순 없을가요?
제가 이해한 내용이 맞는지 모르겠습니다만..
array[0]~array[4] 비교하여 255 혹은 0으로 초기화
array[5]~array[9] 비교하여 255 혹은 0으로 초기화
.....
이런식으로 2048개의 배열을 5개 단위로 255 혹은 0 의 형태로 바꾸려고 하시는건가요?
마지막에 남는 3개의 배열은 어떻게 처리하실지는 저는 잘 모르겠습니다만..
for (i=0; i<sizeof(배열); i+=5){ for (j=0; j<5; j++){ switch (array[j]){ case 0: status--; break; case 255: status++; break; default: exception 처리; break; } } if (status > 0){ 배열 255로 초기화; } else{ 배열 0으로 초기화; } status=0; }정도가 될까요? 다른분이 더 효율적이게 짜주실지도 모릅니다.
노이즈 신호를 어떻게 정의하냐가 문제겠네요.
패턴이 255와 0 밖에 없다면..
아래 코드처럼 쉽게 알아보도록 해서 작업하는게 나중을 위해서 나을거 같아서 짜봤어요..
찾기만 하는 코드라서 수정하는 부분은 추가하셔야 할꺼에요..
패턴이 추가될수도 있으니 이렇게 작업해야 나중에 노이즈 패턴만 따로 때어서 작업하기 편할 꺼 같네요.
#define ON 0xFF // - #define OFF 0x00 // _ /* ---_-- => ------ ---__-- => ------- __-____ => _______ __--___ => _______ */ const unsigned char noise_pattern[/*noise index*/][7] = { {ON,ON,ON,OFF,ON,ON}, // on {ON,ON,ON,OFF,OFF,ON,ON}, // on {OFF,OFF,ON,OFF,OFF,OFF,OFF}, // off {OFF,OFF,ON,ON,OFF,OFF,OFF} // off }; unsigned char test_input[100]={OFF,ON,ON,}; for (int i = 0; i < 100; i++) { found = find_noise_pattern(test_input + i, 7); if (found >= 0) printf("found pattern...at %d.. pattern %d\n", i, found); } int find_noise_pattern(unsigned char *in, int len) { int status = 0; int i = 0; for (; i < 4; i++) { status = 0; for (int idx = 0; idx < len; idx++) { if (noise_pattern[i][idx] == in[idx]) status ++; else break; } if (status == len) { printf("catch~!\n"); break; } } if (i == 4) return -1; return i; }전체 배열을 길의 N의 여러 블록으로 나누어,
전체 배열을 길이 N의 여러 블록으로 나누어,
각 블록별로 N개 안에 N/2 개 초과의 0이 있으면 전체를 0으로,
그렇지 않으면 전체를 255로 채우겠다는 의도로 이해가 되네요.
이게 맞다면 아래와 같이 코딩해도 될 듯요..
int if_zero_is_majority( unsigned char* in, int len ) { int i, count = 0; for ( i = 0 ; i < len ; i++ ) if ( in[i] == 0 ) count++; return ( count > len/2 ); } #define N 5 int main() { unsigned char data[2048]; int i, n; int num_blocks=2048/N; // fill data with noisy signals for ( n = 0, i = 0 ; n < num_blocks ; n++, i+= N ) if ( if_zero_is_majority( &data[i], N ) ) memset( &data[i], 0, N ); else memset( &data[i], 255, N ); }댓글 달기