레이블이 프로그래밍인 게시물을 표시합니다. 모든 게시물 표시
레이블이 프로그래밍인 게시물을 표시합니다. 모든 게시물 표시

2010년 3월 29일 월요일

c++ 코드에서 폴더 생성하기

C 라이브러리를 사용하여 폴더를 생성하려면 다음과 같이 하면 됩니다.

 

[code cpp]
#include <direct.h>

_mkdir("폴더이름"); // Multi-byte 버전
_wmkdir(L"폴더이름"); // Unicode 버전
[/code]

 

win32 라이브러리를 사용하면 다음과 같이 폴더를 생성할 수 있습니다.

 

[code cpp]
::CreateDirectory(_T("폴더이름"), NULL);
[/code]

 

boost 라이브러리를 사용하면 다음과 같이 폴더를 생성할 수 있습니다.

 

[code cpp]
#include <boost/filesystem.hpp>

boost::filesystem::create_directory("폴더이름");
[/code]

 

2010년 3월 27일 토요일

안드로이드 어플리케이션 화면 크기 얻기

안드로이드 어플리케이션에서 화면 크기를 얻는 방법은 다음과 같습니다.

 

[code java] DisplayMetrics displayMetrics = new DisplayMetrics(); WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); wm.getDefaultDisplay().getMetrics(displayMetrics); int width = displayMetrics.widthPixels; int height = displayMetrics.heightPixels; [/code]

 

여기서 context 는 Activity 등에서 얻어온 Context 객체를 의미합니다.

다른 간편한 방법이 있다면 추후에 수정해서 올리도록 하겠습니다.

2010년 3월 26일 금요일

안드로이드 어플리케이션 화면 방향 고정하기

안드로이드 어플리케이션은 기본적으로 폰의 센서에 따라

화면이 가로/세로 방향으로 자동으로 변환됩니다.

그런데 어프리케이션을 개발하다보면 한쪽 방향으로 고정하고 싶을 때가 있습니다.

 

그런 경우 AndroidManifext.xml 파일 안에 방향을 고정하고 싶은 Acitvity에 대한 <activity> 태그 안에 다음과 같은 속성을 추가하면 됩니다.

 

  1. 세로방향으로 고정

    android:screenOrientation="protrait"

  2. 가로방향으로 고정

    android:screenOrientation="landscape"

 

2010년 3월 18일 목요일

MFC 프로젝트에서 소켓 사용하기

MFC에서 소켓을 사용하기 위해서는 프로젝트 생성할 때

Windows Socket을 사용하는 옵션에 체크를 해주면 되지만,

일반적으로 MFC 프로젝트를 생성하여 프로그램을 작성하다가

추후에 소켓을 추가하고자 하면 다시 프로젝트 생성하기가 번거롭습니다.

 

프로젝트를 새로 생성하지 않고 윈도우 소켓을 사용하려면 다음과 같이 하면 됩니다.

 

  1. stdafx.h 파일의 맨 마지막에 다음을 추가합니다.

    #include <afxsock.h>

  2. 프로젝트 App 클래스의 InitInstance() 함수의

    CWinApp::InitInstance();

    라인 밑에 다음과 같은 코드를 추가합니다.

    if (!AfxSocketInit()) {
        AfxMessageBox(_T("윈도우 소켓 초기화에 실패햇습니다."));
        return FALSE;
    }

 

2010년 3월 16일 화요일

boost::thread 의 sleep 사용하기

boost 라이브러리의 thread를 사용할 때 sleep을 사용할 일이 자주 생기는데

boost::thread::sleep 함수는 사용하기가 좀 번거롭습니다.

대신 boost::this_thread::sleep 함수를 사용하면 됩니다.

 

[code cpp]boost::this_thread::sleep(boost::posix_time::milliseconds(30));[/code]

 

인자로 사용되는 boost::posix_time::milliseconds 대신 boost::posix_time::seconds 함수 등으로 시간 단위를 지정할 수 있습니다.

2010년 2월 18일 목요일

ODROID

안드로이드 어플리케이션을 개발하고 테스트할 수 있는 개발기기를 하나 구매했습니다.

국내 업체에서 제작한 ODROID라는 제품으로 하드웨어 스펙도 꽤 좋고

3월 초에 안드로이드 2.1 버전으로 업데이트 해준다고 해서 개발할때 도움이 될 듯 합니다.

 

단 실제 전화기와 달리 3G 통신 모듈과 GPS, 카메라 모듈이 없기 때문에

위 모듈 관련 어플을 개발하려고 할 때에는 안드로이드 마켓에 등록하면 구매할 수 있는

개발 폰을 구매하는게 더 나을 듯 합니다.

 

실제 개발하던 프로그램을 올려보니 에뮬레이터로 보는 것과는 또 다르고, 에뮬레이터에서 확인할 수 없던 버그들을 발견해서 고칠 수 있었습니다.

 

단 볼륨 업/다운 버튼이 터치식으로 되어있는데 너무 민감하게 반응하고, 잠궈놓아도 금방 풀리기 때문에 좀 불편한 감이 있습니다. 이 부분은 보완되었으면 좋겠네요..

 

자세한 설명은 http://www.hardkernel.com 에서 확인할 수 있습니다.

 

2010년 1월 31일 일요일

안드로이드 SDK 설치하기

최근 안드로이드 폰에 대한 관심이 좀 생겨서 안드로이드 SDK 를 설치하고 Hello World 프로그램을 실행해 보았습니다. 역시 처음 써보는 플랫폼이라 설정하는데 시간이 좀 걸리네요. 나중에 다시 삽질하기 싫어서 오늘 고생한 내용을 남겨봅니다.

 

안드로이드 SDK를 설치하려면 먼저 자바 SDK와 이클립스 IDE가 필요합니다.

 

자바 SDK는 http://java.sun.com 에서 다운 받을 수 있고

이클립스 IDE는 http://www.eclipse.org 에서 다운 받을 수 있습니다.

 

전 윈도우 7 64비트를 쓰는지라 x64용으로 다운받았습니다.

이클립스는 주로 Eclipse IDE for Java Developers를 설치해서 사용했는데 이건 64비트용 배포본이 없습니다. 64비트 윈도우에서 이클립스를 이용하려면 다운로드 페이지 맨 밑의 Eclipse Classic을 사용해야 합니다.

 

자바 SDK를 먼저 설치한 후 이클립스는 그냥 압축만 풀면 바로 사용할 수 있습니다.

 

설치가 끝났으면 이제 안드로이드 SDK를 다운받습니다. http://developer.android.com/sdk/ 에서 다운받을 수 있습니다. 다운받은 안드로이드 SDK를 원하는 폴더에 압축을 풀어줍니다. Android 공식사이트에는 폴더 안의 SDK Setup.exe 파일을 실행하면 설치가 진행된다고 하는데 64비트 윈도우라서인지 아무 반응이 없습니다. 다행이 다른 경로로 설치할 수 있습니다.

 

이클립스를 실행하고

Help > Install New Software 를 클릭하여 소프트웨어 설치를 실행합니다. 주소 창에 https://dl-ssl.google.com/android/eclipse 를 입력하고 Add 버튼을 누릅니다.

 

 

OK를 누르면 사이트가 추가되고 Work with 옆의 주소 창의 드롭다운을 내려보면 Android SDK를 선택할 수 있습니다. 선택하면 아래에 다운로드 가능한 패키지가 나타납니다. Developer Tools 를 선택하여 두 패키지를 설치합니다.

 

 

설치가 끝나고 나면 안드로이드 SDK 위치를 지정해주어야 합니다. 이클립스 메뉴에서 Window > Preference > Android > SDK Location 에서 Browse를 클릭하여 경로를 설정합니다.

 

이제 어플리케이션을 구동해보기 위해서는 가상머신을 하나 올려야 합니다.

Window > Android SDK and AVD Manager 를 클릭하면 안드로이드 관리자를 열 수 있습니다.

 

먼저 안드로이드 플랫폼을 설치해야 합니다. Available Packages를 선택하여 타겟 안드로이드 플랫폼을 선택해서 설치합니다.

 

 

Virtual Devices > New 를 선택하여 가상머신을 하나 추가합니다. 메모리 사이즈나 안드로이드 버전은 적당히 주고 하나 만들면 됩니다.

 

여기까지 안드로이드 프로그램을 구동해보기 위한 모든 준비를 마쳤습니다.

 

윈도우 계정 이름이 한글인 경우 참고하세요

 

글이 많이 길어졌는데 여기까지 설정을 마치면 안드로이드 에뮬레이터가 동작하는 것을 볼 수 있습니다. Window > Android SDK and AVD Manager 에서 가상머신을 선택하고 Start 메뉴를 누르면 다음과 같은 화면을 볼 수 있습니다.

 

 

여기까지 설정하는데 2시간, 글쓰는데 1시간이 더 걸렸군요. -_-;;;

2010년 1월 5일 화요일

doxygen이란?

doxygen은 프로젝트 문서화를 쉽게 할 수 있도록 도와주는 도구입니다.

 

프로그램을 작성할 때 일정한 형식으로 주석을 달아주면, 그 주석과 프로그램 구조를 토대로 MSDN의 API 문서나 Javadoc의 함수 설명과 유사한 형식으로 전체 프로그램의 문서를 만들어줍니다.

 

C, C++, C#, Java, PHP, Fortran 등의 소스코드들로부터 HTML, CHM, LaTeX(PDF), Man pages, RTF, XML 형식의 문서를 생성할 수 있습니다.

 

앞으로 시간이 날때마다 doxygen 사용법을 조금씩 정리해볼까 합니다.

 

 

2009년 11월 7일 토요일

Visual C++에서 Xbox360 컨트롤러 제어하기

Visual C++에서 Xbox360 컨트롤러를 제어하기 위해서는 DirectX SDK 가 필요합니다.

DirectX SDK는 아래 링크에서 다운받을 수 있습니다.


XBox 컨트롤러를 사용하기 위해서는 xinput.h 파일을 인클루드 하고, xinput.lib 라이브러리를 추가해줘야 합니다. Win32 DLL 을 만들기 위해서라면 windows.h 도 포함시켜야 합니다.

#include <xinput.h>
#pragma comment(lib, "xinput.lib")

그 이후 아래 코드와 같이 사용할 수 있습니다.
컨트롤러 제어를 해야 하니 아래 코드는 스레드로 만드는게 좋겠습니다.

XINPUT_STATE state;
ZeroMemory(&state, sizeof(XINPUT_STATE)); // 컨트롤러 상태 초기화
DWORD result = XInputGetState(0, &state); // 컨트롤러 상태 얻어오기

while (result == ERROR_SUCCESS) {
// 컨트롤러 제어 코드가 들어가야 함

Sleep(30); // CPU 점유을 100%를 방지하기 위해
result = XInputGetState(0, &state); // 다음 상태 얻어오기
}

컨트롤러 제어 코드는 버튼제어, 진동제어, 스틱제어, 트리거 제어로 아래와 같이 구현할 수 있습니다.

버튼제어는 다음과 같은 방식으로 해결할 수 있습니다.

if (state.Gamepad.wButtons & XINPUT_GAMEPAD_X) {
// X 버튼이 눌렸을때 할 일
}

xinput.h에 정의된 버튼의 상태를 나타내는 매크로는 다음과 같습니다.

#define XINPUT_GAMEPAD_DPAD_UP          0x0001
#define XINPUT_GAMEPAD_DPAD_DOWN        0x0002
#define XINPUT_GAMEPAD_DPAD_LEFT        0x0004
#define XINPUT_GAMEPAD_DPAD_RIGHT       0x0008
#define XINPUT_GAMEPAD_START            0x0010
#define XINPUT_GAMEPAD_BACK             0x0020
#define XINPUT_GAMEPAD_LEFT_THUMB       0x0040
#define XINPUT_GAMEPAD_RIGHT_THUMB      0x0080
#define XINPUT_GAMEPAD_LEFT_SHOULDER    0x0100
#define XINPUT_GAMEPAD_RIGHT_SHOULDER   0x0200
#define XINPUT_GAMEPAD_A                0x1000
#define XINPUT_GAMEPAD_B                0x2000
#define XINPUT_GAMEPAD_X                0x4000
#define XINPUT_GAMEPAD_Y                0x8000

진동은 다음 코드로 제어할 수 있습니다.

XINPUT_VIBRATION vibration;
ZeroMemory(&vibration, sizeof(XINPUT_VIBRATION));
vibration.wLeftMotorSpeed = 65535; // 0 ~ 65535 사이의 수
vibration.wRightMotorSpeed = 0; // 0 ~ 65535 사이의 수
XInputSetState(0, &vibration);

아날로그 스틱의 값은 다음변수에 저장되어 있습니다.

state.Gamepad.sThumbLX // 왼쪽 아날로그 스틱 X축
state.Gamepad.sThumbLY // 왼쪽 아날로그 스틱 Y축
state.Gamepad.sThumbRX // 오른쪽 아날로그 스틱 X축
state.Gamepad.sThumbRY // 오른쪽 아날로그 스틱 Y축

트리거에 해당하는 값은 다음 변수에 저장되어 있습니다.

state.Gamepad.bLeftTrigger // 왼쪽 트리거
state.Gamepad.bRightTrigger // 오른쪽 트리거

2009년 11월 1일 일요일

코드에서 라이브러리 추가하기

비주얼 스튜디오에서 라이브러리를 추가하려면 프로젝트 속성 창을 열어서
일일이 추가해주는 방법이 있지만, 다른 프로젝트에 같은 소스파일을 사용하려고 하면
또 라이브러리를 추가해줘야 하는 번거로움이 있습니다.
이런 경우 소스코드에 라이브러리를 추가해놓는다면 저런 번거로움은 사라지겠죠?

아래 코드를 이용하면 됩니다.

#pragma comment(lib, "라이브러리파일")



문자열 인코딩 변환

ATL의 문자열 인코딩 변환 매크로를 사용하면 문자열 인코딩을 쉽게 변환할 수 있습니다.

char* string = "hello world";
wchar_t* wstring = L"안녕하세요?";

USES_CONVERSION;
wchar_t* wstr = A2W ( string ); // 멀티바이트 -> 유니코드
char* str = W2A ( wstring ); // 유니코드 -> 멀티바이트

이 매크로를 사용하기 위해서는 관련 헤더파일이 인클루드 되어있어야 합니다.
ATL 프로젝트는 따로 할 필요는 없고
MFC 프로젝트나 Win32 프로젝트에서는 다음과 같이 헤더를 추가합니다.

MFC 프로젝트
#include <comdef.h>
#include <afxpriv.h>

Win32 프로젝트
#include <comdef.h>
#include <crtdbg.h>
#include <atlconv.h>

혹시 링크에러가 나는 경우에는 atls.lib 라이브러리를 추가해주면 됩니다.

Visual C++에서 시리얼 포트 연결하기

지금까지 시리얼 포트를 열때 다음과 같이 쓰고있었습니다.

[code cpp]HANDLE comm = CreateFile(
   "COM3",
   GENERIC_READ | GENERIC_WRITE,
   0,
   NULL,
   OPEN_EXISTING,
   FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); [/code]

그런데 저렇게 하면 10번 이상의 포트는 열리지 않는 문제점이 있습니다.
이것때문에 오늘 또 한시간정도 삽질을 햇군요 -_-;;;

10번 이상의 포트를 열고 싶을 때는 다음과 같이 써줘야 합니다.

[code cpp]HANDLE comm = CreateFile(
   "\\\\.\\COM10",
   GENERIC_READ | GENERIC_WRITE,
   0,
   NULL,
   OPEN_EXISTING,
   FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);[/code]
10번 이하의 포트도 이 방법으로 열 수 있으니 항상 이렇게 쓰는것이 좋겠습니다.

2009년 10월 30일 금요일

Visual C++에서 보기 싫은 Warning 안보이게 하기

boost 등의 템플릿을 사용한 외부 라이브러리를 사용하다보면
무시해도 되는 Warning이 엄청나게 많이 발생하는 경우가 있습니다.
보기 싫은 Warning을 보이지 않게 하기 위해서는
해당 라이브러리를 사용하는 클래스의 헤더파일 안에 다음과 같이 써 주면 됩니다.

#pragma warning(disable:경고번호)