반응형

프로그램을 짜다 보면 하드코딩이 아닌 사용자가 입력한 텍스트로 수식을 계산해야 하는 경우가 종종 있다.


계산식이 하드코딩(hard coding)으로 짜면 매우 편하지만 계산식이 하나로 정해져있지 않거나 상황에 따라서 변경되는 경우에는 한계가 있다.


사용자가 정의한 수식은 텍스트 형태로 저장되므로 이를 파싱(parsing)하는 작업은 그리 어려운 작업은 아니다. 물론 4칙연산의 경우엔..



사용자가 입력한 수식에 x^2꼴이나 제곱근(√), 로그함수, 지수함수 등이 들어있으면 모두 대응하기가 어렵다.


따라서 개발 시간 단축과 스트레스 감소를 위해 관련 라이브러리를 사용하기로 한다.


관련된 라이브러리는 구글링하면 다양하게 나온다.


내가 선택한 라이브러리는 바로 muparser이다. 무엇보다 MIT라이센스로 사용에 별도의 제한이 없기 때문이다.


사용법은 여타 외부 라이브러리와 같다.


VS 프로젝트에 추가하고, include로 땡겨서 사용하면 된다.


예제에 나온 코드도 매우 심플하다.


#include 
#include "muParser.h"

// Function callback
double MySqr(double a_fVal) 
{ 
  return a_fVal*a_fVal; 
}

// main program
int main(int argc, char* argv[])
{
  using namespace mu;

  try
  {
    double fVal = 1;
    Parser p;
    p.DefineVar("a", &fVal); 
    p.DefineFun("MySqr", MySqr); 
    p.SetExpr("MySqr(a)*_pi+min(10,a)");

    for (std::size_t a=0; a<100; ++a)
    {
      fVal = a;  // Change value of variable a
      std::cout << p.Eval() << std::endl;
    }
  }
  catch (Parser::exception_type &e)
  {
    std::cout << e.GetMsg() << std::endl;
  }
  return 0;
}

DefineVar : 수식에 존재하는 a라는 문자를 fVal 값으로 정의

DefineFun : 수식에 존재하는 MySqr이라는 문자를 위에 정의한 Mysqr함수로 정의

SetExpr : 텍스트 형태의 수식. 여기에 수식을 입력하면 된다.

Eval() : 수식 계산


예제코드 조금만 보면 금방 응용이 가능하다.


그리고 반드시 try ~ catch 구문을 추가하여 올바르지 않은 수식이 들어왔을 경우 예외처리를 해주자.

반응형

ANSI

미국 국립 표준 협회(American National Standards Institute, ANSI)

미국의 산업 표준을 제정하는 민간단체.

ANSI에서 제정된 표준을 ANSI라고 부르기도 한다.



ANSI가 제정한 표준 중 가장 유명한 것이 ASCII 코드이다.



ASCII 코드 ( 아스키 코드 )

ASCII (American Standard Code for Information Interchange, 미국 정보 교환 표준 부호)

ANSI가 제정한 표준 중 가장 유명한 것이 ASCII 코드이다.


미국에서 표준화한 정보교환용 7비트 부호체계.

000(0x00)부터 127(0x7F)까지 총 128개의 부호가 사용된다.

영문 키보드로 입력할 수 있는 모든 기호들이 할당되어 있는 부호 체계.


장점 : 매우 단순하고 간단하기 때문에 어느 시스템에서도 적용가능하다는 장점

단점 : 2바이트 이상의 코드를 표현할 수 없다. (예 - 한글, 일어)


아스키코드는 모든 문자 크기가 1byte. 영어 외에 표현 어려움.






문자집합 크게 2가지

1. 멀티바이트 문자 집합

2. 유니코드 문자 집합






1. 멀티바이트 문자 집합


아스키코드 ( 1 byte  ) + 다른 문자 ( 2 byte ) 등을 포함한 문자 집합

한 문자 크기가 2 byte이기도 하고 그 이상이기도 하다. ( 영어로 사용될 땐 1바이트 )

문자마다 그때그때 달라요~



특정 문자 집합마다 코드 페이지가 존재한다.

같은 코드번호를 한글 코드 페이지로 해석하면 한글이 나오지만, 일어로 해석하면 일어가 나온다.

이상하게 깨지는 문자들은 멀티바이트 문자 집합이다!






2. 유니코드 문자 집합


아스키 코드 문자를 포함한 거의 모든 문자를 표현

한 문자 크기 2 byte 할당

각각 의 특정 문자는 고유의 유니코드 값을 가진다.







문자열 처리하는 기본 자료형

char, wchar, TCHAR





 

 char

 wchar 

 TCHAR 

 문자 크기

 1 byte

2 byte 

 설정에 따라 컴파일 시에 

 char 이기도 하고 wchar 이기도 하다.

 타입

 ASCII

 UNOCODE

 프로젝트 디버깅 설정에 따라 

 char (ASCII) 인지, 

 wchar (UNICODE) 인지 결정된다.

 

 

 

 

 

 

 

 

음 표가 가운데로 안와....ㅋㅋㅋ








wchar_t


음, 근데 난 wchar_t 찾는중이었다. 더 정리해 봅시다!


참고하는 중 : http://sonhy1.tistory.com/112


댓글이 굿


1 人 : wchar_t 데이터타입은 명백히 UTF-16 으로 인코딩되는 문자열을 다룰때 사용됩니다.


2 人 : whar_t를 C/C++ 표준 상에는 어떻게 다룰지 정해져 있지 않습니다. 

심지어, 최소 단위가 8bit 입니다.

이를 어떻게 다룰지는 compiler-specific 입니다. (컴파일러마다 다름!)

즉, wchar_t가 UTF-16으로 정의된건, MSVC에서만입니다.

wchar_t는 C 표준에 존재하며, (당연히 MS에서 만든게 아닙니다) 이를 MS에서는 UTF-16 형식을 담는 unsigned short로 구현하고 있을 뿐입니다.



-> 보다보니, utf-8 16 32 , UCS-2 어쩌구저쩌꾸하는데 눈이 @@ 팽글팽글 ㅋㅋㅋ




utf-8 과 utf-16 비교


참고하는 중 : http://pickykang.tistory.com/13


UTF-8과 UTF-16은 Unicode를 표현하는 Encoding 방식이다.


UTF-8과 UTF-16의 기본 차이는 문자 하나를 표현할 때 사용할 최소 byte를 의미한다고 볼 수 있다. 


UTF-8로 문자를 표현할 때 1~4bytes만큼 필요하다.

UTF-16은 2bytes(16bit), 4bytes 만큼 필요하다. 


두 Encoding 방식의 큰 차이는 최소 8bit가 필요하다 16bit가 필요하냐에 따라 다른 것이다. 


최적의 상황(저쟝, 통신 용량을 아껴야할 때)이 필요하다면, 어떤 CodePoint를 주로 사용하냐에 따라 UTF-8 또는 UTF-16을 선택하는 기준이 달라질 것이다.








참조 : 


http://klkl0.tistory.com/87


https://namu.wiki/w/ANSI


https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C?from=ASCII


http://blog.naver.com/wondo21c/30043174174





출처: http://juheel.tistory.com/7 [JDevelop]

반응형

C#을 쓰면서 매번 느끼는 사실이지만, C++에 비해 개발 소요시간이 매우 단축된다는 것이다.

 

C++로 디렉토리 내 파일검색 메소드를 작성하려면 보통 20 라인으로 작성할 수 있다.

 

그런데 C#으로는 단 한줄로 디렉토리 내 모든 파일 목록을 가져올 수 있다.

 

심지어, 확장자 지정, 하위디렉토리 검색도 한번에 할 수 있다!

 

코드도 매우 간결하고, C++에서의 귀찮은 재귀함수 고려도 필요없었다.

 

 

 

 public string[] GetSearchFile(String _strPath) 
 {
   string[] files = {"", };
   try 
   {
     files = Directory.GetFiles(_strPath, "*.*", SearchOption.AllDirectories);
   } catch (IOException ex) 
   {
     MessageBox.Show(ex.Message);
   }
   return files;
 }

 

 

반응형

이미지 프로세싱에서 Tolerance와 Threshold 두 용어가 의미와 해석이 모호해서 매번 사전 검색을 했는데 이번에 정리해본다.


  • Tolerance - 허용치, 허용오차..

주변의 설정된 값(Tolerance)보다 작은 픽셀들은 같은 색상의 픽셀로 간주하고 검출함.

값이 높을수록 색상 범위가 넓어짐..

사실, 이미지 프로세싱에서 Tolerance의 종류가 다양한데 그 종류는 다양해도 의미는 비슷하다. Tolerance 값 안에 들어오면 같은 부류(?)로 해석하고 검출한다는것.

  • Threshold - 임계값, 한계값 등으로 해석됨. 

주로 바이너리 이미지(Binary Image) 검출에 많이 사용된다.


설정된 값(Threshold) 보다 낮은 값의 픽셀은 black으로, 높은 광도의 픽셀은 White로 치환한다.

Original imageOriginal imageExample of a threshold effect used on an imageExample of a threshold effect used on an image

image from wikipedia.

반응형

PC에 Geforce Experence가 설치되어 있는지 확인하자.

단축기가 동일해서 VS에서 안먹히는 경우가 있다.

가장 빠른 방법은  Geforce Experence 삭제.

반응형

MFC의 트리메뉴 컨트롤의 아이템 선택 이벤트 후 해당 선택된 아이템의 인덱스를 리턴하는 메소드가 없다.

 

편법으로 아이템 이름으로 찾는 방법도 있지만 코드가 길어지고 추가/수정이 복잡해진다.

 

구글링 결과 index를 구하는 방법을 찾았다.

 

OnTvnSelchanged 이벤트 메소드에서 child 아이템을 루프 태우면서 현재 선택된 item인지 체크하면서 증가 시키는 것이다.

 

이생각을 왜 못했는지..

 

코드의 일부는 아래와 같다. 전체는 출처로 이동해서 확인하길 바란다.

 

 

 

 
    int index = 0;
    HTREEITEM hItem = m_treeCtrl.GetSelectedItem();
    HTREEITEM hChild = m_treeCtrl.GetChildItem(NULL);
    while (hChild)
    {
        if (hChild == hItem) break;
        hChild = m_treeCtrl.GetNextItem(hChild, TVGN_NEXT);
        ++index;
    }

출처 : C++/(MFC)트리 컨트롤 몇 번째 아이템인지 조회

 

 

 

+ Recent posts