Skip to main content

Posts

Showing posts from June, 2006

C++ of the Day #9 - Boost.Python 사용하기 #1

Python 은 가장 인기있는 interpret 언어중의 하나입니다. Python의 장점 중 하나는 C/C++ 모듈과 쉽게 연동할 수 있다는 점입니다. 물론 손으로 일일히 wrapper를 만드는 것은 손이 많이 가고 에러를 만들수 있는 작업이나 SWIG 등과 같은 도구를 사용하면 쉽게 python 모듈을 만들 수 있습니다. Boost.Python 은 이런 SWIG와 같이 python 모듈을 쉽게 만들 수 있도록 도와주는 라이브러리로 순수 C++만을 사용한다는 점이 SWIG와 다른 점입니다. 그리고 개인적으로는 Boost 라이브러리에 포함되어 있는 것들이 왠지 좀 더 믿음직스러워서... :-) 이번 글에서는 Boost.Python 문서에 나와 있는 예제 를 가지고 간단하게 python 모듈을 만드는 방법에 대해서 알아보겠습니다. Requirements 리눅스 이 글에서는 리눅스 환경에서의 사용 방법을 설명한다. Boost.Python 라이브러리 (1.33.1) Boost 라이브러리를 다운로드받아 아래와 유사한 명령으로 라이브러리를 빌드한다. bjam -sTOOLS=gcc -with-python install bjam의 --prefix 옵션으로 라이브러리가 설치될 위치를 변경할 수 있다. Python 라이브러리 (2.4.3) Python을 다운로드 받아 빌드하여 설치한다. 위의 경우와 유사하게 configure의 --prefix 옵션으로 설치될 위치를 변경할 수 있다. Write C++ Code 다음과 같이 코드를 작성한다. // greet.cpp #include <stdexcept> char const* greet(unsigned x) { static char const* const msgs[] = { "hello", "Boost.Python", "world!" }; if (x > 2) throw std::range_error("

Coverity Prevent - 소스 코드 검사 도구

이번에 회사에서 소스 코드 검사 도구를 하나 구입하는데 이것저것 비교해본 결과 Coverity Prevent 라는 툴이 가장 좋아 이걸로 결정했다고 하더군요. 간단히 말하자면 Lint 처럼 소스 코드에 대해 static analysis를 하는 도구입니다. 그래서 시험삼아 돌려본 결과를 보게 되었는데 그 품질이 정말 놀랍군요. 메모리 릭이나 초기화하지 않은 변수, 버퍼 오버런, null 체크등등 거의 정확하게 에러를 보고해 줍니다. 다음은 전체 코드에서 발견된 문제점들을 리스트 형태로 보여주는 화면입니다. 정말 많군요. ;-) 다음은 이중 하나의 에러를 자세히 보기 위해 선택하여 들어간 화면입니다. 소스 코드에 라인번호와 에러가 발생한 위치, 에러가 발생할 수 있는 조건들을 자세히 보여줍니다. 정말 '와우!'입니다. 각 함수와 같은 이름들을 클릭하면 그 함수로 바로 이동할 수 있습니다. 사용해보니 개인적으로는 purify 같은 runtime 검사 도구보다 더 맘에 드는군요. 사실 Lint 계열의 도구들은 한번도 사용해본 적이 없는데 다른 것들도 한번 구해다 써봐야겠습니다. 이 툴의 유일한 문제는 비싸다는 것이랍니다. :-)

은하수를 여행하는 히치하이커를 위한 안내서

[bookcover:8979840179] ** 경고: 각주에 스포일러 있음 ** 드디어 그 유명한 은하수를 여행하는 히치하이커를 위한 안내서 를 읽고 말았습니다. 책의 좋고 나쁨의 기준을 주로 재미 에서 찾는데 이 책은 별 다섯개를 주어 마땅할 것 같네요. 너무 너무, 너무 너무 너무, 너무 너무 너무 너무, 한달에 20바이트 정도밖에 안 되는 메모리 릭을 잡았을 때만큼, 멀티 쓰레딩 프로그램에서 한줄만 바꿔서 deadlock이나 race condition을 없애는 방법을 찾았을때만큼, 재밌습니다. :-D 개인적으로 뉴로맨서 이후 최고의 S.F 소설입니다. 사실 장르가 뭐였는지도 잘 모르겠습니다. 왠지 그냥 S.F. 소설이라고 하긴에 책이 너무 섭섭해할 듯하군요. 허무맹랑 황당무계 상상초월 S.F 정도라고나 할까요? 책을 다 읽고 인생의 궁극적인 의미를 알 수는 없었지만 ((그 질문과 답에 대한 오묘한 관계 때문에 알 수도 없다지만 말이죠. 참고로 답은 forty-two(42)입니다. ;-) )) 신이 그 피조물들에게 보낸 명쾌한 메시지 ((We apologize for the inconvenience.)) 를 알고 나니 책의 주인공들처럼 세상의 그 모든 일들이 왠지 조금은 이해가 되는것 같네요. :-) 한문장 한문장 정말 재미있게 읽었습니다.

재밌는 Desktop UI

YouTube에 있는 BumpTop 3D Desktop Prototype이라는 비디오입니다. 정말 창의적인 Desktop UI로 실제 써봐도 재밌을 것 같긴 한데 반드시 좋은 검색 기능이 같이 있어야겠네요. 안 그러면 진짜 책상위처럼 파일 찾느라 고생 좀 할 것 같아요. 더이상 OS GUI의 desktop metaphor는 metaphor가 아니라 그대로 desktop이군요. ;-) 보너스로 아래 비디오도 한번 보세요. 9.11 테러와 관련된 음모론을 다룬 비디온데 정말 흥미진진합니다. 개인적으로는 이 얘기가 진짜였음 좋겠네요. Loose Change 2nd Edition, Korean Caption

Common Lisp 설치하기

왠지 요새 Lisp을 공부해야될것만 같은 기분이 들어 책을 빌려 보기 시작했습니다. ((Practical Common Lisp, Peter Seibel, APRESS, 2005)) Ruby에 Lisp에... 요새 갑자기 모르는 프로그래밍 언어 공부에 필받았네요. ;-) 이번 글은 제가 사용하기로 한 SBCL와 SLIME의 설치 방법입니다. Requirements Linux 머신 emacs SBCL: Steel Bank Common Lisp SLIME: The Superior Lisp Interaction Mode for Emacs SLIME는 emacs의 mode로 Lisp 프로그래밍을 위한 IDE라고 보시면 됩니다. ((Intergrated Development Environment)) Installation SBCL 다운받은 sbcl-0.9.12-x86-linux-binary.tar.bz2의 압축을 풉니다. $ sh install.sh을 실행시킵니다. - 이때 root 권한이 없어 자신의 홈디렉토리 밑에다 생성해야 할 경우에는 다음과 같이 INSTALL_ROOT 환경 변수를 셋팅한 후 install.sh을 실행시킵니다. 아래 내용은 자신의 홈디렉토리 밑에 생성한 경우를 대상으로 설명합니다. $ export INSTALL_ROOT=${HOME} 환경 변수에 다음과 같은 내용을 추가합니다. export PATH=${PATH}:${HOME}/bin export SBCL_HOME=${HOME}/lib/sbcl $ sbcl이 정상적으로 실행되는지 확인합니다. SLIME 다운받은 slime-2.0.zip의 압축을 풉니다. 디렉토리의 이름을 slime으로 바꾼 후 적당한 디렉토리로 옮겨 놓습니다. 저의 경우에는 아래 디렉토리를 사용했습니다. ${HOME}/etc/slime emacs 파일에 아래 내용을 추가합니다. (add-to-list 'load-path "~/etc/slime/") ; your SLIME

C++ of the Day #8 - 구구단 프로그램

Ruby의 each에 대해 공부하다가 작성해 본 구구단 프로그램입니다. 역시 한줄로 깔끔하게 정리가 되네요. (2..9).each { |i| (1..9).each { |j| puts "#{i} * #{j} = #{i * j}" } } C++ 프로그래머로써 이와 비슷한 기능을 구현하려면 어떻게 해야 할까 생각해보았습니다. 일단 한줄에 loop안에서 동작할 함수를 집어 넣기 위해서는 boost::lambda를 사용해야 합니다. 최종적으로 만들어질 문법을 먼저 보시죠. range(2, 9)(1, 9).f2(cout << _1 << '*' << _2 << '=' << _1 * _2 << '\n' ); 위의 식은 아래와 같이 수행됩니다. for (int i = 2; i <= 9; ++i) for (int j = 1; j <= 9; ++j) cout << i << '*' << j << '=' << i * j << '\n'; 여기서 f2는 두개의 인자를 받는 lambda임을 알려주는 멤버 함수입니다. lambda식 자체에서는 그 식이 몇개의 인자를 사용하는지를 알수 없기 때문에 이와 같이 명시적으로 두 개의 인자를 가지는 식이라는 것을 알려주어야만 합니다. ((boost::function이나 boost::function_traits에는 arity 멤버가 있어 이를 통해 그 함수가 몇개의 인자를 사용하는지를 알 수 있습니다.)) 또 하나 신경써야 할 점은 loop가 두번 중첩되었다고 해서 반드시 그 안에서 사용되는 함수가 인자를 두개 사용한다는 뜻은 아니라는 점입니다. 두번 중첩된 loop안에서 사용될 수 있는 함수의 인자수는 0개, 1개 또는 2개가 될 수 있습니다. 즉, 아래와 같이 사용할 수도 있다는 점이죠.

Flock 베타 버전 출시

--- Flock isn’t any ordinary browser, it is the browser for you and your friends. 오래 기다려왔던 Flock 베타 버전이 며칠전에 출시되었습니다. 써본다 써본다 하던 것이 이제야 인스톨해보게 되었네요. 역시 이전 개발자 preview 버전보다 최초 시작시에 사용자로부터 기본 설정을 입력받는 것부터 시작해서 많이 편리해졌네요. 물론 안정성이 최고 중요하지만 아직 많이 써보질 않아 이 부분에 대해서는 말할 것이 없네요. 지난번에 개발자 preview 버전을 사용할땐 며칠 사용하고 나서 개인 설정이 모두 날라가 버리는 바람에 Flock을 삭제해버렸던 기억이 있습니다. Flock에서 가장 멋진 기능은 Blog Post 기능이 아닐까 싶습니다. 지금 이글도 이 기능을 이용해 작성하고 있습니다. 글에 그림이나 사진 삽입시에도 drag&drop으로 사진을 끌어다 놓으면 자동으로 Flock이 Flickr에 업로드한 후 이를 링크해줍니다. 그리고 이전에 읽었던 글에서 scrap해 두었던 글을 post에 사용할 수도 있고요. 위의 스크린샷에 보이는 top bar의 사진들은 Flickr의 제 계정에 있는 것들입니다. 물론 다른 사람의 사진을 tag별로 볼수도 있고 그중의 하나를 골라 자신의 post에 사용할 수 도 있습니다. 사실 Flickr uploader로써도 편리하게 사용할 수 있습니다. 그리고 del.icio.us를 Flock의 즐겨찾기로 사용할 수 있습니다. 현재 이렇게 사용하고 있기는 한데 즐겨찾기는 directory 형식에 익숙해져 있다보니 tag 형식의 즐겨찾기는 아직 적응이 안되는군요. :-) 험... 사용하다보니 Flock에서 blog post를 쓸 때 입력하는 tag는 post의 말미에 추가되는 technorati로 연결되는 링크군요. 전 Ultimate Tag Warrior를 사용하고 있는데 tag 설정은 나중에 다시 Wordpress에 로그인해서 해줘야겠네요. 관

마인드 맵 북

[bookcover:8985481045(마인드맵북)] 93년도 책이니 오래도 된 책이네요. 마인드 맵이라고 그림도 많이 보고 어디서 보기도 많이 봤는데 이 책을 통해서 제대로 알게 되었습니다. 일단 연습을 많이 해보라기에 펜과 연습장을 좀 사서 그려보았는데 일단 생각처럼 잘 진행이 되질 않네요. 연습이 많이 필요할 것 같습니다. :-D 그리고 FreeMind 라는 open source 마인드 맵 프로그램도 있네요. 물론 상용 버전보다야 못하겠지만 기본적인 기능은 모두 있는 것 같습니다. 그림도 깔끔하게 나옵니다. 아래는 스크린샷을 위해 작성해 본 멋진 개발자 라는 마인드 맵입니다. 회사 도서관에서 빌려 읽고 내용이 좋아 한권 구입하려 했는데 모두 절판이네요. 좀 오래되었다 싶더니만... 흠... 원서를 사서 봐야 할려나. :-( 다음과 같은 내용이 기억이 남습니다. 우뇌와 좌뇌를 모두 사용해야 한다. 기억력과 창조력은 별개의 것이 아니다. 방사 사고((한가지 생각에서 다른 생각으로 계속 확장되는 방식의 사고))는 뇌의 기본적인 능력이다. 마지막으로 레오나르도 다빈치의 **완전한 정신 개발을 위한 규칙들**입니다. 특히 네번째 규칙이 마음에 드네요. :-) 과학을 예술적으로 연구한다. 예술을 과학적으로 연구한다. 감각을 계발한다 - 특히 보는 법을 배운다. 모든 것은 그밖의 다른 모든 것과 연결되어 있다는 것을 인식한다.

Ruby 공부 시작

Ruby 언어를 살펴 보던 중 다음 라인에 반해 공부를 해보기로 결정했습니다. 역시 프로그래밍 언어도 뽀대가 중요합니다. ;-) ARGF.each { |line| print line if line =~ /Ruby/ } 위의 코드는 아래 코드를 한줄로 표현한 것입니다. 이보다 더 깔끔하게 one-line 코딩을 할 수 있는 언어가 또 있을런지... :-D while gets # assigns line to $_ if /Ruby/ # matches against $_ print # prints $_ end end

재밌는 퀴즈 몇개

웹 서핑을 하다가 우연히 Sample Interview Questions 라는 페이지를 찾았는데 제목은 뭔가 이상하지만 결국은 재밌는 퀴즈들이 모여있는 페이지입니다. 오랫만에 머리를 써보자 생각하고 몇 문제 풀어보았는데 재밌네요!! ;) 앞에서부터 풀고 있는데 한번 시간되면 풀어보세요. 사각형의 케잌안에 사각형 모양의 구멍이 있습니다. 이 구멍의 크기나 각도는 어떻게 되어 있더라고 상관없습니다. 한칼에 이 남은 케잌을 정확히 이등분하려면 어떻게 잘라야 할까요? 정수로 이루어진 배열이 있습니다. 이 배열의 sub 배열중 최대값을 가지는 sub 배열을 O(N) 의 복잡도로 찾는 프로그램을 작성하세요. - 배열: 93 5 42 -68 -91 56 -93 5 80 92 - 정답: [7, 9] = 5 + 80 + 92 = 177 네명의 사람이 다리의 한쪽에 있습니다. 이 다리는 한번에 최대 두명만 건널 수 있으며 건너는 사람들은 반드시 손전등을 가지고 있어야 합니다. (밤이랍니다.그리고 당근 손전등은 한개입니다.) 단 각 사람이 다리를 건너는데 걸리는 시간은 사람에 따라 다르며 두명이 건널때는 둘 중 느린 사람의 속도에 맞추어야 합니다. 각 사람의 속도가 다음과 같을 때 17분만에 모든 사람이 건널 수 있는 방법을 찾으세요. - 사람1: 건너는데 1분 - 사람2: 건너는데 2분 - 사람3: 건너는데 5분 - 사람4: 건너는데 10분 두번째 문제의 답만 빼고는 해당 페이지에 답이 있습니다. 제가 작성한 두번째 문제의 답은 내일 올려보겠습니다. :-) 원문 Given a rectangular (cuboidal for the puritans) cake with a rectangular piece removed (any size or orientation), how would you cut the remainder of the cake into two equal halves with one straight cut of a knife ? You&#

C++ of the Day #7 - ADL (Argument Dependent Lookup)

Question 오늘 내용은 다시 뉴스그룹에서 하나 가지고 왔습니다. (( comp.lang.c++.moderated:template parameter's namespace exposed? )) namespace N { class A { }; template <class T> T1 operator + (T1 op1, T2 op2) { return op1; } } } template <class T> class B { }; int main() { N::A a1, a2; a1 + a2; // works as it should B<N::A> b1, b2; b1 + b2; // oops, this one compiles too! B<int> b3, b4; b3 + b4; // no match for operator +, just the way it should be } 여기서 질문은? 왜 두번째의 b1 + b2 가 컴파일이 정상적으로 되는가? B 클래스가 있는 전역 영역에는 operator + 가 없는데... 입니다. Answer 일단 문제를 파악하기 위해서는 ADL ((Argument Dependent Lookup 또는 Argument Dependent Name Lookup. 초기에는 규칙을 만든 사람의 이름을 따서 Koenig Lookup이라고 불렸었습니다.)) 에 대해서 알고 있어야 합니다. 자세한 내용은 Name Lookup 이라는 글을 참고하시고요. 그럼 이제 찾아봐야 할 내용은 template parameter도 ADL의 규칙에 포함되는가 여부인데요 C++98에 보면 3.4.2.2절의 마지막 부분에 다음과 같은 내용이 있습니다. --- If T is a template id, its associated namespaces and classes are the namespace in which the template is defined; f

C++ of the Day #6 - A way to get the type of an expression without evaluating the expression

오늘은 The C++ Source 에서 글을 읽다가 발견한 멋진 테크닉 하나 소개합니다. 바로 아래 나와 있는 코드입니다. (( Conditional Love: FOREACH Redux )) // a simple type wrapper template<class T> struct type2type {}; // convert an expression of type T to an // expression of type type2type template<class T> type2type<T> encode_type(T const & t) { return type2type<T>(); } // convertible to type2type for any T struct any_type { template<class T> operator type2type<T> () const { return type2type<T>(); } }; // convert an expression of type T to an // expression of type type2type without // evaluating the expression #define ENCODED_TYPEOF( container ) ( true ? any_type() : encode_type( container ) ) 위의 코드에서 가장 멋진 부분은 바로 가장 아래 줄의 ternary conditional operator (?:) 를 사용한 부분입니다. 이 코드에서 원하는 것은 매크로의 container 부분을 evaluation하지 않고 container의 타입만을 다음 template 함수에 전달하는 것이며 여기서는 type2type<container> 타입의 형태가 전달되기를 원합니다. 물론 여기서 encode_type(container) 를 바로 사용하면 container 부분이 eval

Google Spreadsheet 서비스 시작

Google이 Writely 라는 웹 워드프로세서 회사를 인수한 이후 이제 엑셀과 흡사한 웹 스프레드시트 까지 내놓았군요. 엑셀을 많이 사용하는 편은 아니지만 위의 스크린샷처럼 간단히 사용해 보았습니다. 물론 사용의 편리함에서는 아직 많이 뒤쳐지지만 ajax로 이런 것까지 가능하다는 것을 생각하면 굉장하군요. 물론 반대로 이정도가 ajax의 한계라고 생각한다면 역시 굉장한 문제가 되겠지만요. 암튼 이제 약간의 인내심만 있다면 거의 모든 문서를 웹상에서 작성할 수 있겠군요. ((아직 워드 프로세서나 스프레드시트같이 user interactive한 프로그램들은 ajax만으로는 사용자의 인내심을 필요로 하고 있지 않나요? :-) 그러고 보니 ajax란 user interactivity를 좋게 하기 위한 기술인데... ;-))) 문서의 미래? 그런데 Writely나 ThinkFree같은 웹용 워드 프로세서의 경우를 조금 더 생각해보면 웹상에서 작성하여 웹에서 읽고, 편집하고, 공유한다면 왜 굳이 이런 off-line 형식의 문서들이 필요할까요? 대부분의 워드프로세서를 사용하는 문서들은 wiki 문서로 대체 가능하지 않을까 싶은데요. Wiki같은 웹 문서로 작성하면 이론적으론 한번 작성하여 스크린용, 인쇄용, PDA용, 시각장애인용등의 형태들로 변환이 가능합니다. ((http://www.w3.org/TR/REC-CSS2/media.html)) 게다가 자동으로 히스토리 관리까지 해주죠. 사실 .doc와 같은 형식으로 문서를 작성하여 문서 저장소에 등록하고 나면 이후에 다시 그 문서를 찾아서 수정하거나 보기란 쉽지 않습니다. 검색 기능이나 디렉토리 기능같은 것들이 있다고는 하지만 실제 검색된 후에도 엔트리의 파일들을 열어서 찾는 내용이 맞는지 확인하는 것은 매우 지루한 작업이죠. 무엇보다 아무도 그 문서를 갱신하고 싶어하지 않습니다. :-) 이런 시스템들이 만약 wiki를 사용해 만들어졌다면 어떨까요? 현재 나와있는 wiki들은 많은 기능을 기본, 혹은

C++ of the Day #5 - C++0x에서 변경될 몇가지 내용 소개

오늘은 DDJ에 올라온 Living By the Rules: Part II 에 소개된 C++0x에서 변경될 내용에 대해 몇가지 소개합니다. 반가운 내용들이 많이 있네요. 먼저 nested template을 사용하는 경우 두개의 괄호를 항상 띄어썼어야 했는데 C++0x에서는 붙여써도 된답니다. std::vector<std::pair<int, std::string="">> vect; 이 경우 nested template 안에서 shift-right operator를 사용해야 할때는 괄호를 쳐주어야 합니다. 하지만 이렇게 사용할 일이 얼마나 있을까 싶습니다. Y<x<(6>>1)>> x4; 두번째는 다음에서 friend 선언안의에 Ty와 같이 "elaborated type specifier"이 아닌 타입이 선언되면 에러가 발생했는데 ((C++98의 7.1.5.3의 2항에 다음과 같이 나와 있습니다. If the identifier resolves to a typedef name or a template typeparameter, the elaboratedtypespecifier is illformed. [Note: this implies that, within a class template with a template type parameter T, the declaration friend class T; is illformed.])) C++0x에서는 friend 선언의 타겟으로 사용될 수 있는 것들의 범위를 넓혀 아래 코드도 C++0x에서는 사용할 수 있다고 합니다. 참고로 아래 코드는 Java의 final과 유사하게 final 클래스에서 더이상 상속받을 수 없게 하기 위한 코드입니다. template <class ty=""> class no_children { // template to block inheritance from

드디어 사이트를 위한 테마 결정!

드디어 사이트를 위한 테마를 결정했습니다. :-) 원래 테마야 기분날때마다 바꿀수 있어야 하겠지만 이것저것 커스터마이징을 하다보면 실제론 한번 정하면 바꾸기 어려운 것 같습니다. 그래서 신중하게 고른다는 것이 근 일주일이나 걸렸네요. 테마 리스트 에서 거의 모든 테마를 하나씩 확인하다가 Two Columns의 'L' 까지 가서야 마음에 드는 것을 찾을 수 있었답니다. 바로 지금 보고 있는 limelite 테마입니다. ((작업중에 확인해보니 limelite 테마가 어디서 많이 본 듯 했는데 역시나... Web 2.0에 관심을 가지면서부터 즐겨 찾고 있는 태우’s log 에서 봤던 테마였네요. 뭐 어쩌겠습니까? 그냥 이걸로 갑니다. :-D)) 하지만 너무 오래전 테마라 Widgetizing이 되어 있지 않더군요. 설명 을 봐가며 Widget을 적용 시켜 봤는데 생각보다 쉽더군요. 한 너댓줄 추가했나? :-) 그리고 기왕이면 다홍치마라 나름대로 조금 이쁘게 꾸미기 위해 이것 저것 아이콘도 좀 붙여봤습니다. ((사이드바에서 사용한 몇몇 아이콘들은 역시 Web 2.0 관련하여 즐겨찾고 있는 류한석의 피플웨어 에서 가져왔습니다. :-))) ((아직 얕은 css 지식이지만 다음 두 책에서 많은 도움을 받았습니다. 저같은 개발자도 무지 재밌게 읽었답니다. :-D [bookcover:8989975778(실용예제로 배우는 웹 표준)] [bookcover:8989975891(웹 2.0을 이끄는 방탄웹)])) 참고로 이 사이트에 적용된 플러그인들은 다음과 같습니다. 그대로 사용한 것들도 있지만 맘에 들게 만들기 위해 조금 수정한 것들도 몇개 있습니다. Akismet - Spam 댓글 필터링을 위한 플러그인 BookCover - ISBN을 가지고 책 표지를 보여주는 플러그인 - 얼마전 연습삼아 만들어봤던 것입니다. :-) FD FeedBurner Plugin - 피드의 트래픽을 FeedBurner로 돌려주는 플러그인 Get Recent

C++ of the Day #4 - Changing const object

Question 오늘은 별로 흥미진진한 내용은 아니네요. 역시 뉴스그룹에서 가져왔습니다. (( comp.lang.c++.moderated:prog output? )) #include "iostream.h" void main(void) { const int i = 10; int *p; p = const_cast (&i); *p = 111; cout << i << " " << *p; } /* output: 10 111 */ 질문은... 왜 i 와 *p의 출력이 다르게 나오는가? Answer 뉴스그룹의 친절한 답변자들 모두 답에 앞서 코드에 있는 문제들을 지적하네요. 표준 헤더를 쓸 생각이었다면 iostream.h가 아니라 iostream을 써야 할것이다. 또한 표준 헤더라면 <>괄호를 사용하여야 한다. main의 리턴 타입은 int이다. 모두 적용하면 다음과 같이 되겠군요. #include int main() { const int i = 10; int *p; p = const_cast (&i); *p = 111; std::cout << i << " " << *p; } 진짜 중요한 문제의 답은 간단합니다. const 객체를 수정하는 코드의 결과는 정의되어 있지 않으므로(undefined behavior) 컴파일러는 위 프로그램에서 어떤 값이라도 출력할 수 있습니다. 너무 간단하죠? 참고로 undefined behavior에 대해 얼마전 DDJ 에 올라온 Pete Becker의 Living By the Rules 에서 인용해봅니다. Violations of semantic rules that are not diagnosable semantic rules result in undefined behavior; that is, the C++ Standard

죽은 경제학자의 살아있는 아이디어

[bookcover:8934918292(죽은 경제학자의 살아있는 아이디어 - 현대 경제사상의 이해를 위한 입문서)] 사실 경제학이 무엇인지 전혀 알지 못했습니다. (사실 대강 뭔지는 안다고 생각했었으나 이 책을 읽고 아니라는 것을 알았습니다.) 하지만 스테디셀러인 이 책을 읽고 나서 경제학도 참 재밌는 학문이겠구나라는 생각이 들었습니다. 다음 케인스의 경제학의 대가에 대한 견해를 보면 대략 경제학이란 무엇인가에 대해 힌트를 얻을 수 있을 것 같습니다. 그는 수학자이자 사학자인 동시에 정치가이며 철학자이어야 한다. ... 그는 기호들로만 이해한 것들을 평이한 말로 설명해야 한다. 특수한 경우들을 일반적인 시각에서 고찰할 수 있어야 하며, 추상과 구상을 동일한 사고의 지평위에서 다룰 수 있어야 한다. 과거의 경험 아래 미래를 목표로 현재를 연구 해야 하고, 인간의 본성이나 사회규범 중 미세한 일부라 할지라도 관심의 대상에서 빠뜨려서는 안 된다. 무엇보다도 그는 공평무사함과 과단성을 겸비해야만 한다. 예술가처럼 초연하고 청렴하면서도 가끔씩 정치가처럼 치열하게 세속적이어야 하는 것이다. 그리고 한사람의 아이디어가 세계에 미치는 영향이 얼마나 클 수 있는지도 알 수 있습니다. 생각해보세요. 여러분이 "난 국가와 경제는 이런 이런 원리로 움직인다고 생각해. 그리고 이를 개선하기 위해선 이렇게 하면 될꺼야"라고 주장하고 이 주장이 받아들여져 실제 그대로 실행했을때 예상대로 움직인다고... 생각만 해도 신나는 일이지만 매우 어려운 일임에는 틀림없죠. 이런 이유로 경제학에 "우울한 과학"이라는 별명이 붙은게 아닐런지... 굳이 공산당 혁명을 이끈 마르크스의 자본론의 예를 들지 않아도 현재도 얼마나 많은 국가들이 이런 경제학자들의 이론대로 국가를 움직이고 세계를 움직이고 있는지 알 수 있습니다. 이런 면에서 경제학은 철학과도 상당히 많이 닮아 있는것 같습니다. 읽기 시작하기전의 기우와는 달리 책장 넘기기가 아까울 정도로 재밌는 책이

C++ of the Day #3 - Multiply inherit from classes with conflicting function names

Question 역시 C++ 뉴스그룹에 올라온 것으로 찾아보면 자주 반복되어 온 질문중의 하나입니다. (( comp.lang.c++.moderated:Multiply inherit from classes with conflicting function names )) struct A { virtual long fun() = 0; }; struct B { virtual bool fun() = 0; }; struct Unfortunate : public A, public B { ??? }; 질문을 요약해보면... ???부분을 합법적인 코드를 가지고 구현할 수 있는가? 물론 두 fun 함수 모두 각자의 구현을 가져야 한다. Answer 워낙 많이 다루어진 질문이라 바로 답으로 넘어갑니다. 여기서 답이라는 것은 일반적으로 이런 방법을 사용한다는 뜻입니다. 다음과 같이 중간 계층의 클래스를 추가하여 각 함수에 고유의 이름을 줌으로써 각각의 함수 구현이 가능합니다. struct Abis : A { virtual long funA() = 0; virtual long fun() { return funA(); } }; struct Bbis : B { virtual bool funB() = 0; virtual bool fun() { return funB(); } }; struct Unfortunate : Abis, Bbis { virtual long funA() { ... } virtual bool funB() { ... } }; 위의 코드를 사용하여 다음과 같이 사용할 수 있습니다. Unfortunate u; u.funA(); u.funB(); A* a = &u; B* b = &u; a->fun(); // call long Unfortunate::funA() b->fun(); // call bool Unfortunate::funB() 2006-06-05 추가 관련된 읽은만한 글이 있어 추가합니다. 이