프로그래밍 605

gcc 와 ncurses 를 이용한 카라슈바 곱셈 연습기

ncurses(또는 curses) 는 Linux/Unix 계열의 환경에서 VT100 등의 터미널과 호환되는 윈도우형 입출력 라이브러이다. 이를 이용하면 윈도우의 임의의 위치에 출력도 하고, 임의의 위치에서 입력을 받을 수도 있다. * 카라슈바 곱셈 참조 다음은 Linux 나 Cygwin 환경이면 gcc 로 컴파일하여 실행되는 C 소스이다. /* * Filename: ezmult_003.c * * Compile: gcc -o ezmult_003 ezmult_003.c -lform -lncurses * * Execute: ./ezmult_003 * * Date: 2014. 1. 6. (Mon) v0.002 * Date: 2014. 1. 8. (Wed) v0.003 */ #include #include #in..

프로그래밍/C 2014.01.08

64bit 리눅스에서 32bit 용 C 소스 컴파일하기

32bit OS 에서는 int 타입과 long 타입이 다 같이 4바이트의 크기를 갖지만. 64bit OS 에서는 int 타입이 4바이트, long 타입이 8바이트의 크기를 갖는다. 그렇다면 64비트 리눅스 환경에서 32비트 용으로 작성된 C 소스를 gcc 로 컴파일하려면 어떻게 해야 할까? // Filename: testIntSize.c int main() { #include int main() { printf("sizeof(int) = %d\n", sizeof(int)); printf("sizeof(long) = %d\n", sizeof(long)); return 0; } # 64비트 용으로 컴파일하고 실행하기 $ gcc -o testIntSize testIntSize.c $ ./testIntSize ..

프로그래밍/C 2014.01.04

오일러(Euler) phi 함수 구현하기

Visual C++ 2010 으로 컴파일할 경우, 헤더파일 inttypes.h 가 Visual C++ 2010 에는 빠져 있으므로 http://msinttypes.googlecode.com/svn/trunk/inttypes.h 를 가져와서 아래의 소스와 동일한 디렉토리에 두고 컴파일한다. char * 타입의 C 스트링으로 부터 long long 타입의 정수로 파싱하려면 C99 에서 정한 함수 strtoll 함수를 쓰면 되는데 이 함수 역시 Visual C++ 2010 에는 빠져 있으므로, _strtoi64 함수로 대체하기 위해 소스의 앞 부분에 매크로 정의 #define strtoll _strtoi64 를 추가하였다. 또 main 함수 안에서 사용된 llabs 함수는 long long 타입의 정수의 절댓..

프로그래밍/C 2013.12.14

long long 타입의 정수를 printf 함수로 출력하기

우선 다음 소스는 컴파일하는데는 아무 문제가 없지만 실행 결과는 전혀 엉뚱하다. printf 함수에 사용된 %lld 포맷에 문제가 있기 때문이다. /* * Filename: testLongLong0.c * * Compile: gcc -o testLongLong0 testLongLong0.c * or * Compile: cl testLongLong0.c */ #include int main() { printf("Maximum long long value is %40lld\n", 9223372036854775807LL); printf("Maximum long long value is %40llu\n", 9223372036854775807ULL); printf("Maximum long long value is..

프로그래밍/C 2013.12.03

C++ 언어에서 동작하는 쓰레기 수집기(Garbage collector)

C/C++ 언어 프로그래밍에서 까다로운 부분 중의 하나는 획득했던(할당받았던) 메모리를 여하히 해제하느냐이다. 프로그램밍의 사소한 오류로 메모리 부족 현상이 쉽게 일어나기 때문이다. 프로그램밍의 사소한 오류로 메모리 부족 현상이 쉽게 일어나기 때문이다. 자바 언어, 파이썬 언어, C# 언어 등은 자동으로 쓰레기 수집(garbage collection)이 이루어지므로 거의 신경쓰지 않아도 되지만, C 언어는 소스 작성하는 프로그래머가 직접해야 한다. 오래 전(10여년 전)에 Hans Boehm 가 만들었던 C/C++ 언어용 쓰레기 수집기(Boehm-Demers-Weiser conservative garbage collector, 줄여사 BoehmGC 러고 부름)를 이용하여 컴파일되고 실행되는 소스이다. 이..

프로그래밍/C++ 2013.10.20

C 언어에서 동작하는 쓰레기 수집기(Garbage collector)

C 언어 프로그래밍에서 까다로운 부분 중의 하나는 획득했던(할당받았던) 메모리를 여하히 해제하느냐이다. 프로그램밍의 사소한 오류로 메모리 부족 현상이 쉽게 일어나기 때문이다. 자바 언어, 파이썬 언어, C# 언어 등은 자동으로 쓰레기 수집(garbage collection)이 이루어지므로 거의 신경쓰지 않아도 되지만, C 언어는 소스 작성하는 프로그래머가 직접해야 한다. 오래 전(10여년 전)에 Hans Boehm 가 만들었던 C/C++ 언어용 쓰레기 수집기(Boehm-Demers-Weiser conservative garbage collector, 줄여사 BoehmGC 러고 부름)를 이용하여 컴파일되고 실행되는 소스이다. 이 쓰레기 수집기를 쓰면, 메모리 해제(free)를 프로그래머가 신경쓰지 않아도 ..

프로그래밍/C 2013.10.19

명령줄 컴파일러로 컴파일하는 간단한 Visual C++ 2010 용 MFC 응용프로그램 예제

다음 한 개의 C++ 소스파일 만으로 간단한 Visual C++ 2010 용 MFC 응용프로그램을 만든다. // Filename: MfcHelloApp.cpp // // Compile: cl /nologo /MD /W3 /EHsc /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Yc /FD /c MfcHelloApp.cpp // // Link: link /nologo /subsystem:windows /incremental:no /machine:I386 /out:"MfcHelloApp.exe" MfcHelloApp.obj // // Execute: MfcHelloApp // // See: %VisualStudio2010_HOME%\Sa..

프로그래밍/C++ 2013.10.10

명령줄 컴파일러로 컴파일하는 간단한 Visual C++ 2010 용 Win32 응용프로그램 예제

다음 한 개의 C++ 소스파일 만으로 간단한 Visual C++ 2010 용 Win32 응용프로그램을 만든다. // Filename: ExSdkApp.cpp // // Compile: cl /Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D "WIN32" // /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /Gm- /EHsc /GS /Gy /fp:precise // /Zc:wchar_t /Zc:forScope /Gd /analyze- /errorReport:queue ExSdkApp.cpp // kernel32.lib user32.lib gdi32.lib // // Execute: ExSdkApp // // See: http://msd..

프로그래밍/C++ 2013.10.10

Visual C++ 2010 에서 컴파일되는 여러가지 컨솔 Hello 예제 모음

1. hello_a.cpp 첫 번째 예제는 main() 함수 대신 wmain() 함수를 쓰는 예제이다. wmain 함수의 두 번째 파라미터를 const char *argv[]) 로 하는 대신에 const wchar_t *argv[] 로 해야 하며, 인자로 받은 문자열을 부동소수점수로 변환하기 위해 _wtof(wchar_t[]) 함수를 쓰고 있으며, 한글 출력을 위해 stdio.h 의 printf() 함수를 그냥 쓰면 된다. wchar_t[] 타입의 문자열을 prntf() 함수로 출력하기 위해서는 포매터 %s 대신 %ws 를 써야 한다. 만일 #include 구문을 생략하면, 컴파일 시 printf(), _wtof(), pow(), log() 함수들을 찾지 못하는 에러가 난다. // Filename: he..

프로그래밍/C++ 2013.10.09

C++98 에서와 C++11 에서의 swap 함수 사용법 비교

C++98 에서는 swap 함수를 쓸려면 #include 을 했지만, C++0x 와 C++11 에서는 #include 로 바뀌었다. 또 빝트인 타입의 데이터를 swap 할 때는 이전 처럼 std::swap(dat1. data2) 하지만, 빌트인 타입이 아닌 데이터를 swap 할 때는 std:: 를 붙이지 않고 swap(data1, data2) 로 해야 한다. Visual C++ 의 cl 로 컴파일할려면 Visual Studio 2008 이상이면 되고. g++ 로 컴파일할려면 g++ 4.5.x 이상이면 된다. 만약 Haskell Platform 에 설치된 g++ 4.5.2 로 컴파일할려면 옵션 -enable-auto-import 를 추가하면 성공작으로 컴파일될 것이다. 다음 소스의 컴파일과 실행을 테스트한..

프로그래밍/C++ 2013.09.30