다중if문 구조의 최소화 할려면 어떻게 해야하는지 조언 좀 부탁드립니다.

bongpjh의 이미지

배열의 공간은 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;
			}
		}
	}
morolty의 이미지

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문의 중첩보다는 빠를것 같습니다.

bongpjh의 이미지

답변 감사합니다.

현재 morolty님께서 알려주신 방법대로 했는데 정상적으로 잘 됩니다. 또 한번 감사드립니다.

한가지만 더 여쭈어보겠습니다. 배열값이 2048개인데 이 전체 배열을 status 음수 양수가 아닌 배열 2048개를 5개씩 순차적으로 비교하게 할 순 없을가요?

morolty의 이미지

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;
}

qiiiiiiiip의 이미지

전체 배열을 길이 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 );
}   

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.