2007/11/29 00:49

Untitled

그냥 그저 그렇게 흘러가는 하루. 생각해보니, 집에 와서 세수도 안했다. 회사에서 저녁을 먹기 싫어서 꾹참고 집으로 왔다. 이미 치워진 상을 다시 차려서 혼자 먹고 나니, 배가 불러서 인지 춥고 배고파서 움츠러 든 몸이 나른해진다. 나른해져 버리니 만사가 다 귀찮다. 그래서 <textarea> 에다가 내용을 입력할 때, 타이핑 소리가 나도록 하는 것을 만들고 싶어졌다.(사실은 어제밤에 만들려다가 손을 댔다가는 다음날 지각이 뻔해서 그냥 꾹 참고 잤다)
뭐 어쨌든. 그리하여 우여곡절 끝에 대충 소리는 나게 만들고 나니깐, 한글 입력은 또 윈도우 IME 에서 해주는 거라서 자소단위로 입력할 때는 onkeypress 이벤트가 발생하지 않는 갑다.(Characters entered through an IME do not register through keyCode or charCode. http://developer.mozilla.org/en/docs/DOM:event.keyCode ) 별로 답이 안나옴을 느낀다. 이 정도 장난거리 가지고는 하루의 피로도 그닥 가시지가 않는다.

그래도 회사에서 오늘 짧은 시간 집중하여, 고질적인 메모리 깨먹는 버그를 하나 잡았다. 별건 아니고 대충 요약하면 아래와 같은 코드다.


대략 이런 시츄에이션..? (Language : c)
  1. struct {
  2.   char *list[20];
  3.   int id[20];
  4. } type_t;
  5. int func(const char *str, int id)
  6. {
  7.   int i=0;
  8.   type_t some;
  9.   for ( i=0; i < 20 ; i++ ) {
  10.     if ( some->id[i] == id )  {
  11.       some->list[i] = malloc(300);
  12.       memcpy(list[i], str, strlen(str)+1);
  13.     }
  14.   }
  15. }

답: str 의 길이가 300 이상이면 넥서스 옆에 마인박아놓은 꼴이다.

물론 딱 한눈으로 보기에도, 문제가 있음을 알 수 있다. 근데, 저놈이 수천개의 파일중에 어느 누군가의 실수로 슬쩍 숨어들었다면... 찾기는 정말 쉽지 않다. 이런 코드로 몇날 며칠을 삽질하다 보면, 정말 C 는 할게 못된다는 생각을 하게된다. 그래도 오늘은 쉽게 잡은 편인데... 기분은 그닥 업이 되지 않는다..
그냥 아무거나 적어내려 가려 했는데, 결국엔 코드가 등장하는구나. 너도 참...

내일은 기운을 차려보자. 나만의 우주를 창조하는 작업을 계속하자. 전파 수신 양호.

2007/11/29 00:49 2007/11/29 00:49
[top]
TAG :: ,

2006/07/10 00:23

복잡한 선언을 분석하는 법

http://wiki.kldp.org/wiki.php/CLangaugeComplexDeclaration

위를 참고하면 어느정도는 쉽게 해결할 수 있다.
cdecl 라는 유틸리티가 있는데
$ sudo apt-get install cdecl 로 간단히 설치할 수 있다.

사용법은 help 를 처보면 된다.
아래는 간단한 사용법.

missu@missu-laptop:~$ cdecl
Type `help' or `?' for help
cdecl> explain void *(*my_func)(int, struct _name)[]
declare my_func as pointer to function (int, struct _name) returning array of pointer to void
cdecl> explain int *name[]
declare name as array of pointer to int
cdecl> explain int (*name)[]
declare name as pointer to array of int

비록 영어로 나오기는 하지만, 도저히 모르겠을때 explain 으로 한번 영어로된 결과를 보고나서 다시 생각해보면 그나마 좀 더 쉽게 접근할 수 있다. 사실은 그전에 typedef 로 가독성이 떨어지는 선언은 하지 않는 것이 바람직 하겠지만..

아래는 보너스. 과연 이런것을 쓸일이 프로그램짜면서 생길런지...
cdecl> explain void (*(*signal)(int,void(*)(int)))(int);
declare signal as pointer to function (int, pointer to function (int) returning void) returning pointer to function (int) returning void


2006/07/10 00:23 2006/07/10 00:23
[top]
TAG :: ,

2006/07/08 22:28

5["abcdef"]와 같은 이상한 표현

http://www.cinsk.org/cfaqs/html/node8.html#6.11

99년에 대학에 입학했으니, 지금껏 줄곧 열심히 하지는 않았지만 그래도 C를 해온지가 몇년째인가..
근데 이런건 정말 처음 본다.
아래는 신성국님이 번역한 C FAQ 의 일부분이다.
Q 6.11
5["abcdef"]와 같은 이상한 표현을 봤습니다. 이것이 C 언어에서 쓸 수 있는 표현인가요?
Answer
쓸 수 있습니다. Subscript 연산자인 []에는 교환 법칙 (commutative law)이 성립합니다.6.6 a[e]는 어떤 expression ae에 대해, 하나가 포인터 expression이고, 하나가 정수 수식이란 전제 아래에서, *((a) + (e))와 완전히 같습니다 (identical). 이 증명은 다음과 같습니다:
  a[e]
*((a) + (e)) (\EM{by definition})
*((e) + (a)) (\EM{by commutativity of addition})
e[a] (\EM{by definition})
어떤 C 책에서는 이런 것을 자랑삼아 보여주기는 하지만, `혼동스러운 C 컨테스트 (Obfuscated C Contest)'에 쓰이지 않는한, 따로 특별히 쓸모 있는 표현이 아닙니다 (질문 [*]20.36을 참고하기 바랍니다).

C 언어에서 문자열은 char 타입 배열이기 때문에, "abcdef"[5]란 표현은 틀린 표현이 아니며, 'f'로 평가됩니다. 이 것을 다음 코드의 줄인 표현으로 생각할 수 있습니다:

  char *tmpptr = "abcdef";

... tmpptr[5] ...

실제 이 코드가 쓰이는 예는 질문 [*]20.10에서 볼 수 있습니다.


저런 식으로 같은 주소값을 가리킨다니 할말은 없지만, 그래도 신기한 거 하나 배웠다. ^^
오늘 날씨 와이리 덥노~

2006/07/08 22:28 2006/07/08 22:28
[top]
TAG :: ,