Dev Tool Tips/C/C++2009. 11. 10. 16:28
1) GETTIMEOFDAY
struct timeval nowtime;
gettimeofday(&nowtime,NULL);
printf("%d, %d\n", nowtime.tv_sec, nowtime.tv_usec);

2) CLOCK_GETTIME()
struct timespec time;
clock_gettime(CLOCK_MONOTONIC, &time);
printf("%d, %d\n", time.tv_sec, time.tv_nsec);

-- 참고 --
CLOCK_MONOTONIC: 특정 시점을 기준으로 한 시각(부팅 후부터의 시각)
CLOCK_REALTIME: 년월일의 날짜


Posted by young.h.rhie
Dev Tool Tips/C/C++2009. 9. 17. 21:10
아래의 HEXPEAK들은 위키피디아에서 가져온 것임(http://en.wikipedia.org/wiki/Hexspeak)
  • 0xABADBABE ("a bad babe")
  • 0xBAADF00D ("bad food")
  • 0xBADCAB1E ("bad cable")
  • 0xBADDCAFE ("bad cafe")
  • 0xBEADFACE ("bead face, or face bead")
  • 0xC0ED ("coed")
  • 0xCAFEBABE ("cafe babe")
  • 0xCAFED00D ("Cafe Dude")
  • 0xD15EA5E ("disease") 
  • 0xDEADBABE ("Dead Babe")
  • 0xDEADBEEF ("dead beef")
  • 0xDEADDEAD ("dead dead")
  • 0xDEFEC8ED ("defecated")
  • 0xFACEFEED ("face feed")
  • 0xFEE1DEAD ("feel dead")
  • 0xFEEDFACE ("feed face")

Posted by young.h.rhie
Dev Tool Tips/C/C++2009. 8. 19. 15:38

0이면 에러가 아니고 그 외에는 모두 에러라고 하자

#define CHECK_ERR(err, function) \
do \
{\
        if(err)\
          {\
          printf("[!] (%s:%d)%s=%d\n", __FUNCTION__, __LINE__, #function, err);\
          }\
  } while(0)


참고로 __FUCTION__ 매크로는 gcc에서만 사용할 수 있다.
Posted by young.h.rhie
Dev Tool Tips/C/C++2009. 1. 20. 22:07
이 코드는 리눅스 커널 소스 코드에서 본 것인데 유용할 것 같아서 적어둔다.

#ifdef XXXXXXXX
# define pprintk(args...)    printk(## args)
#else
# define pprintk(args...)    do ; while (0)
#endif


#define dprintk(num, format, args...) \
    do { \
        if (debug >= num) \
            printk(format, ##args); \
    } while (0)
Posted by young.h.rhie
Dev Tool Tips/C/C++2008. 12. 18. 13:53
소프트웨어 코드에서 흔히 쓰는 용어 중에서 일반 사전에서의 설명으로만으로는 이해가 잘 안되는 단어들이 있다. 이 글은 그러한 단어들을 모아 정리한다.

  • offset : 어떤 지점에서 떨어진 거리
  • threshold : 임계값. 어떤 상태를 판단하기 위한 측정의 임계값. 원래는 문턱, 문지방 등을 의미한다.
  • carousel : (원래는 놀이기구인 회전목마를 의미한다) 반복해서 들어오는 데이터의 1회전
  • decimation : 많은 것에서 일부를 추려냄
  • handle : 어떤 대상을 구분하기 위해 붙인 번호
  • ancillary data: 보조(종속적인) 데이터
  • payload : 사전적인 의미는 화물의 내용물. 하드웨어적으로 이야기할 때는 중계기를 의미하고 소프트웨어적으로 이야기할 때는 전송될 데이터의 실제적인 내용(헤더 등을 제외한 것)을 의미한다
  • coefficients: 계수
  • glitch: 사전적으로는 결함을 의미하나 일반적으로 임베디드 소프트웨어 등에서 파형이 올라가거나 내려갈 때 예기치 못하게 발생하는 급작스러운 잡음과 같은 파형을 뜻한다
  • jitter: 원래 뜻은 신경과민 등을 뜻하며, IT 용어로 사용될 때는 신호의 불안정성을 의미. 특히 계측기의 파형으로 볼 때 신호 파형의 좌우 진동상태를 말하는 경우가 보통. 전송에서는 시간적인 위치가 정규 시점에서 전후로 변동하는 것을 의미.


Posted by young.h.rhie
Dev Tool Tips/C/C++2008. 10. 10. 13:51
example 0)
void (*p_func)(char *) = NULL;
extern void my_print(char *s);
void test(char *s)
{
    p_func = my_print;
    p_func(s):
}

example 1)

float Plus    (float a, float b) { return a+b; }
float Minus   (float a, float b) { return a-b; }
float Multiply(float a, float b) { return a*b; }
float Divide  (float a, float b) { return a/b; }

float Calculate(float a, float b, float (*p_Function)(float, float))
{
   float result = p_Function(a, b);
   return result;
}

int main(void)
{
    Calculate(10, 20, &Plus);
    return 0;
}


example 2)
typedef struct
{
  void(*callback_fn)(void);
}
test_callback_t;

extern void test1();
extern void test2()

void test(void)
{
  test_callback_t callback[2];
  /*원래는 함수이름 앞에 &를 붙이는 것이 더 정확하고 이식성이 좋다*/
  callback[0].callback_fn = test1;
  callback[1].callback_fn = test2;
  /*Call callbacks*/

  callback[0].callback_fn();
  callback[1].callback_fn();

  return;
}
Posted by young.h.rhie
Dev Tool Tips/C/C++2008. 10. 2. 13:43

##args 부분을 눈여겨 볼 것.
다른 방법도 있으나, 이 방법이 무난하다. gcc가 아닌 컴파일러에서는 테스트가 필요할 수 있음.


#define dprintf(fmt, args...) \
    printf("(%s:%d): " fmt, __FUNCTION__, __LINE__ , ##args)


혹은 GCC 이외의 C99의 표준을 지원하는 컴파일러의 경우에서는
#define dprintf(format, ...) printf(format, __VA_ARGS__)



Variable Arguments와 __FUNCTION__ 매크로를 지원하지 않는 경우의 방법

#define dprintf \
     xxx_info(__LINE__, __FILE__), xxx_print

static const char *xxx_filename;
static int xxx_linenum;


void xxx_info(int line, const char *file)
{

    xxx_linenum = line;

    /*Get File Name Only*/
    xxx_filename=strrchr(file, (int)'\\');
    xxx_filename++;

}

int xxx_print(const char *fmt, ...)
{
    va_list ap;
    printf("(%s:%d) ", xxx_filename, xxx_linenum);
    va_start(ap, fmt);
       vprintf(fmt, ap);
    va_end(ap);
    return printf("\n");

}

Posted by young.h.rhie
Dev Tool Tips/C/C++2008. 7. 10. 13:55
typedef enum tagSet_Bit_Mode_e
{
    ON,
    OFF,
    FLIP
} Set_Bit_Mode_t;

unsigned int set_bit(const unsigned int src,
         const int nPosition,
         const Set_Bit_Mode_t mode)

{
    unsigned int retValue=0;

    switch (mode)
    {
        case ON:        retValue=(src | (1<<nPosition)); break;
        case OFF:    retValue=(src & ~(1<<nPosition)); break;
        case FLIP:    retValue=(src ^(1<<nPosition)); break;
        default: printf("[!] Wrong Parameter\n"); break;
    }
    return retValue;
}
Posted by young.h.rhie
Dev Tool Tips/C/C++2008. 7. 3. 11:36
C 언어에서 명시적으로 나타내지 않는 한 short, int, long 등은 signed의 속성을 가진다.
그러나 char의 경우 unsigned인지 signed인지는 구현환경(implementation)에 따라 다르다.

다시 말하면 아래는 모두 같은 표현이다
short
short int
signed short
signed short int

역사적으로 보면 char 타입의 signed 형은 나중에 생겼다.
char가 signed인지 unsigned인지는 일반적으로 문제가 생기지 않으나 표준 라이브러리에서 파일의 끝을 의미하는 EOF를 -1로 정의하기 때문에 약간 골치가 아프게 된다.(sdtio.h에 #define EOF (-1)로 되어 있음). 프로그래머 입장에서는 EOF를 체크하는 함수에 관해서는 char를 쓰지 않고 int를 사용해야 된다.

예를 들면 아래와 같은 코드는 좋지 않다
  char c; /*Wrong... Use int instead of char*/
  while(c=getchar() != EOF)
    putchar(c);

char가 unsigned일 경우 위의 코드는 올바로 동작하지 않는다. 왜냐하면 getchar()가 -1을 리턴하더라도 c에는 255가 들어가기 때문이다.  또, char가 unsigned면  -1이 내부적으로 unsigned integer로 변환되어 65535(0xFFFF) (implementation에 따라 혹은 0xFFFFFFFF가) 되어 위의 비교문은 결국 255 != 65535가 된다.

아래의 코드를 직접 컴파일해서 실험해보라.

 int main(int argc, char** argv)
 {
     char x=0xff;
     if(x==0xFF)
        printf("x==0xff\n");
     else   
        printf("x!=0xff\n");
     return 0;
  }      

의외라고 생각하는가? 당연하다고 생각하는가?

앞의 코드에서 main() 함수의 첫문장 char 대신에 int, signed char, unsigned char 등으로 바꾸어 테스트해보라.




Posted by young.h.rhie
Dev Tool Tips/C/C++2008. 7. 1. 17:41
#include <stdio.h>
int main(int argc, char** argv)
{
  printf("sizeof('a')=%d\n", sizeof('a'));
  return 0;
}

$ ./a.out
sizeof('a')=4


놀라울지 모르겠지만 C에서 문자 상수의 크기는 int와 같다.
그러나 C++에서는 문자상수의 크기는 char와 같다.
Posted by young.h.rhie