레이블이 C++인 게시물을 표시합니다. 모든 게시물 표시
레이블이 C++인 게시물을 표시합니다. 모든 게시물 표시

2009년 7월 22일 수요일

Duff's device

http://en.wikipedia.org/wiki/Duff%27s_device

switch 와 do 를 섞어 쓴 코드를 본적이 있는데 이게 아주 유명한 코드였군.
적어둔다.

2009년 1월 22일 목요일

MinUnit: C 에서 유닛 테스트 간단하게.


cmake테스트를 주로 쓰는 편이라 테스트를 위해서 작은 바이너리들을 여러개 만드는 편인데 이 바이너리 코드들은 대부분 정형화 되어있다.

테스트할 함수 불러보고 리턴이 맘에 들면 조용히 지나가고 리턴이 맘에 안들면 뭐라뭐라 찍어주고 main 이 실패값을 리턴하도록 되어있는데 너무 뻔한 작업이다 보니 매크로를 쓰게 되고.. 그런데 이걸 그냥 즉흥적으로 하다보니 나중에 보면 매번 조금씩 다른 매크로를 만들었더라.

그러던 참에 List of unit testing frameworks 에서 MinUnit 을 구경하게 됐고 매크로만으로 이루어진게 내가 평소 하던 짓이랑 똑같아서 앞으로 이놈을 쓰기로 했다.

아예 minunit.h 파일을 새로 만들때마다 위 코드(의 수정버전)을 채워버리도록 emacs 에서 세팅하고 사용중.


2009년 1월 14일 수요일

C 에서 한바이트를 비트단위로 찍어보기

한동안 자주 쓸것같은 함수네.
여기 적어둔다.
버퍼포인터 주고받기 구찮아서 그냥 2진수 모양의 10진수를 리턴하도록 했다.


#include <stdint.h>
#include <stdio.h>

/* 어쩌다 보니 비트값까지 찍어야 할 판이네. 그냥 간단히 찍기 위해서
* 스트링버퍼에 담아주는 방식이 아니고 0 하고 1 로 이루어진 십진수로
* 리턴을 받아서 이걸 %08d 등으로 찍을수 있게 했다. */

int foo(uint8_t b)
{
int i,r = 0;
int base = 1;
for(i = 0; i < 8; ++i)
{
r += base * ((b>>i) & 0x01);
base *= 10;
}
return r;
}


int main()
{
int i;
for(i = 0; i < 256; ++i)
printf("%3d: %08d 0x%02x\n",
i,
foo(i), /* %08d 로 찍자 */
i);

/* 4bit 단위로 끊어봤어 */
for(i=0; i<256; ++i)
printf("%3d: %04d %04d\n",
i,
foo(i)/10000,
foo(i)%10000);
}