Study - Programming/C/C++2010. 6. 29. 17:41


우와..만들었다!!
Posted by 머리
Study - Programming/C/C++2009. 6. 23. 19:50
In a graphical Microsoft Windows-based application, a window is a rectangluar area of the screen where the application displays output and receives input from the user.
- Microsoft Windows 기반의 그래픽 application에서 'window'는 결과물을 표시하고 사용자로부터 입력을 받는 스크린의 사각 영역이다.
Therefore, one of ther first tasks of a graphical Windows-based application is to create a window.
- 그러므로 Windows기반의 그래픽 application의 첫번째 작업은 'window'를 생성하는 것이다.

A window shares ther screen with other windows, including those from other applications. Only one window at a time can receive input from ther user.
- 다른 application들을 포함해서, 'window'는 다른 'window'와 스크린의 영역들을 공유한다. 사용자로부터의 입력은 오리지 하나의 'window'만 받을 수 있다.
The user can use the mouse, keyboard, or other input device to interact with this window and the application that owns it.
- 이 'window'와 그것을 소유한 application과 사용자는 마우스,키보드 등의 장치들로 상호 작용할 수 있다.

About Windows

This topic describes the programming elements that applications use to create and use windows; manage relationships between windows; and size, move, and display windows.
- 이 주제는 응용프로그램이 'window'들을 생성,사용, 다른 'window'들과의 관계 관리, 'window'들의 크기조정, 이동, 표시를 위한 프로그래밍 요소들을 기술한다.

Desktop Window

When you start the system, It automatically creates the desktop window. The desktop window is a system-defined window that paints  the background of the screen and serves as the base for all windows displayed by all applications.
- 당신이 시스템을 시작할 때, 시스템은 자동적으로 'desktop window'를 생성한다. 'desktop window'는 화면에 배경 화면을 그리고 모든 application들이 표시하는 'window'들의 기반을 제공해 준다.

The desktop window uses a bitmap to paint the background of the screen. The pattern created by the bitmap is called the desktop wallpaper.
- 'desktop window'는 바탕 화면을 그리기 위해 비트맵을 이용한다. 비트맵이 만드는 패턴을 'desktop wallpaper'이라고 한다.

-계속-
Posted by 머리
Study - Programming/C/C++2009. 4. 6. 19:28
  어제 _beginthreadex()함수를 호출하다가 이런일이 있었다. 예를 들면 대충 이러한 상황이였다.

class ex_Class  //예제 클래스
{
private:
  unsigned WINAPI ThreadProc(LPVOID lParam)  //스레드를 위한 함수
  {
    //코오드
  }
  void TestFunction();

}
  void ex_Class::TestFunction()
  {
    _beginthreadex(NULL,0,ThreadProc,...);//스레드 생성
  }


이러니 _beginthreadex부분에서 컴파일 에러가 났다.  이유는 ThreadProc가 올바르지 않는 호출이라고..
처음에는 왜 그런지 몰라서 한참 헤매다가 나중에 겨우 이유를 찾았다.(당시에 인터넷도 안되고 해서 로컬 MSDN으로 한참 고생했다.)


우선 ThreadProc는 &ex_Class:ThreadProc같은 형태로 인자를 넘겨야 한다. ex_Class의 멤버함수이므로 접근 한정자를 붙여 주고 포인터이므로 &를 붙여 준다.
다음으로ThreadProc는 static으로 설정해야 한다. 함수 포인터의 호출이기 때문에 어느 한 객체에 소속되지 않게 하기 위해서 static으로 선언해야 한다. 이때문에 함수 내에서 멤버의 접근을 하기 위해서는 다음과 같은 방식으로 접근하여야 한다.

static unsigned WINAPI ThreadProc(LPVOID lParam)
{
  ex_Class *cls = (ex_Class*)lParam;
  cls->(멤버) 접근;
}

이는 꼭 스레드호출만이 아니라 함수포인터와 관련된 부분에서 해야 하는 것이다. 이런 상황에서 이런 오류를 만나서 예시가 이렇게 되었을뿐, 다른 상황에서도 마찬가지이다.
으흠... 아직 배우고 공부해야 할게 많다.
Posted by 머리
Study - Programming/C/C++2009. 2. 4. 08:38
BOOL CreateProcess(
  LPCTSTR lpApplicationName,
  LPTSTR lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL bInheritHandles,
  DWORD dwCreationFlags,
  LPVOID lpEnvironment,
  LPCTSTR lpCurrentDirectory,
  LPSTARTUPINFO lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
);

MSDN 참고 주소 : http://msdn.microsoft.com/en-us/library/ms682425.aspx (닷넷 기준이라 조금 모양이 다릅니다.)

자식 프로세스를 생성한다. 이때 이 함수를 호출한 프로세스는 부모 프로세스(Parent Process), 함수 호출로 생성된 프로세스를 자식 프로세스(Child Process)라고 한다.


  LPCTSTR lpApplicationName : 생성할 프로세스의 실행파일 이름.
  LPTSTR lpCommandLine : 생성할 프로세스의 파라미터 문자열

  LPSECURITY_ATTRIBUTES lpProcessAttributes : 프로세스의 보안 속성
  LPSECURITY_ATTRIBUTES lpThreadAttributes : 스레드를 전달할 경우 보안 속성
  BOOL bInheritHandles : 자식프로세스의 부모 프로세스의 핸들 소유 여부
  DWORD dwCreationFlags : 생성하는 프로세스의 프로세스 특성
  LPVOID lpEnvironment : 프로세스가 실행헤 필요한 문자열 저장. Enviroment Block 지정
  LPCTSTR lpCurrentDirectory : 자식 프로세스의 현재 디렉터리 설정
  LPSTARTUPINFO lpStartupInfo : 자식 프로세스의 속성이 담긴 구조체의 주소값
  LPPROCESS_INFORMATION lpProcessInformation : 자식 프로세스의 정보를 저장할 구조체 주소값


그리고 다음은 LPSTARTUPINFO의 구조이다.

typedef struct _STARTUPINFO {
  DWORD  cb;
  LPTSTR lpReserved;
  LPTSTR lpDesktop;
  LPTSTR lpTitle;
  DWORD  dwX;
  DWORD  dwY;
  DWORD  dwXSize;
  DWORD  dwYSize;
  DWORD  dwXCountChars;
  DWORD  dwYCountChars;
  DWORD  dwFillAttribute;
  DWORD  dwFlags;
  WORD   wShowWindow;
  WORD   cbReserved2;
  LPBYTE lpReserved2;
  HANDLE hStdInput;
  HANDLE hStdOutput;
  HANDLE hStdError;
} STARTUPINFO,
*LPSTARTUPINFO;

특별히 중요한 요소가 있다기보다는 이런게 있다라는 전체적인 것을 아는 것이 좋다. 자세한 것은 MSDN(http://msdn.microsoft.com/en-us/library/ms686331(VS.85).aspx) 을 참조하자.

다음은 LPPROCESS_INFORMATION 의 구조이다.
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId; } PROCESS_INFORMATION,
*LPPROCESS_INFORMATION;
자세한 사항은 좀 더 공부를 해 보아야겠다.

그리고 주의해야 할 점이 유니코드 기반에서 함수 실행 시 lpCommandLine인자에 바로 _T("abc.exe")형식으로 문자열을 넣으면 런타임에러가 난다. 함수 내부적으로 문자열에 변화를 가하기 때문이라고 한다. 그러므로 넘길때는 반드시 따로 문자열 변수를 만들어 넘기자.



Posted by 머리
Study - Programming/C/C++2008. 12. 15. 03:42


달팽이 모양 수열
한번 만들어 봤다.

오랫만에 하니까 영 하는게 어색하다. 아..잠자야 하는데..

Posted by 머리
Study - Programming/C/C++2008. 10. 21. 19:37
  요즘 '조엘 온 소프트웨어'라는 책을 읽고 있는데 그 책에서 문자열 관련 이야기가 나오기에 그 내용을 참고하여 한번 이야기 하고자 한다.

  C의 문자열 구조는 먼저 문자열 내용이 있고 그 다음 '널 문자'가 들어가는 형식이다. 즉 "Hello"라는 문자열을 표현하려면 

'H' 'e' 'l' 'l'o' '\0' (단,\0 은 Null Characher)

  이렇게 6글자(sizeof(char) == 1이므로 6Byte)를 차지하게 된다. 이 Null Character의 사용 용도는 문자열의 끝(End of String)을 나타내기 위한 방법인데, 적어도 C에서는 이 문자가 없다면 메모리 어느 부분에 우연히 이 문자가 있는 것을 발견할때까지 계속해서 읽게 되어 엉뚱한 문자열이 나오게 된다.

  언뜻 보면 무슨 내용이 들어 있을 지 모르는 메모리에 이런 방식으로 문자열을 담는 것은 꽤 괜찮은 방법처럼 보인다. 하지만 조금 만 더 생각해보면 이것보다 좋은 대안을 찾을 수 있다.
  무엇보다 위 방식의 가장 큰 단점은 무슨 작업을 하려면 반드시 문자열 처음부터 끝까지 탐색을 하러 가야 한다는 것이다.
  예를 들어보자. 문자열의 길이를 알아내는 함수(strlen)를 구현해 보자고 한다면 문자열의 첫 포인터에서 Null Character을 찾을 때까지 포인터를 이동시켜야 한다.
  그런데 만약에 이 문자열의 길이가 100이라면? 그리고 1000이라면? 이런식으로 가면 문자열이 길면 길수록 그 처리 속도는 길어질 것이다. 다른 예로, 두 문자열을 잇는 함수(strcat)를 구현하자고 하면 두 문자열의 길이를 알아서 한 문자열에 할당된 크기를 다시 합친 크기로 재할당 해야 하고 문자열의 끝으로 이동해서 복사하는 과정을 수행해야 한다. 이것 역시 문자열의 길이를 구하는 과정에서부터 속도의 문제가 발생한다.
  이런 것을 해결하기 위한 방법으로는 뭐가 있을까? 이런 방법이 있을 수 있다.

'5' 'H' 'e' 'l' 'l' 'o'

  즉, 문자열의 첫 바이트에 문자열의 길이를 넣는 것이다. 이러면 굳이 끝까지 가서 널 문자를 찾을 필요 없이 길이를 첫 바이트에서 알 수 있으므로 그 크기 만큼 포인터를 이동해서 해결 할 수 있다. 여기서 주의해야 할 점은 끝부분에 Null Character을 넣는 방식은 하지 말라는 것이다. 그렇게 하면 정말 이도 저도 아닌 형편없는 문자열 표현 방식이 된다.
  다른 방법으로는 String Class를 구현하는 것인데, 이미 객체지향 프로그래밍 언어나 좀더 고급언어인 경우에는 지원되는 경우가 많다. 클래스의 멤버로 다음과 같은 예를 들 수 있다.

1. 문자열의 저장할 변수
2. 문자열의 길이를 저장할 변수
3. 기타 문자열 관련 함수

  위 방법으로는 효과적이고 자기 나름대로의 알고리즘으로 효율적으로 문자열을 관리 할 수 있을 것이다. 그리고 나 같으면 문자열을 저장 할 때 더이상 Null Character은 넣지 않도록 구현 할 것이다. 그리고 C++같은 경우라면 Operator Overloading등의 기능을 통해서 출력 및 입력, 기타 연산등의 방법도 구현해 보겠다.다만 위의 방법은 각자의 클래스 구현으로 표준이 규정되어 있지 않다면 호환성에서 문제가 발생 할 수 있겠고 조금 무거울 것이다.

  이외에도 많은 방법이 있을 것이다. 중요한 것은 이런 기본 데이터 타입에 만족하지 않고, 뭔가 다른 방식을 조금씩 연구하고 구현해 본다면 많은 도움이 될 것이다.
Posted by 머리
Study - Programming/C/C++2008. 6. 8. 02:32
음.. 근무할 때 핑 테스트한다고 창을 열댓개를 띄워 놓고 그러니까

작업 표시줄이 너무 복잡하더라

그래서 어떻게 할 방법이 없을까 생각하다가 아예 실행 중인 프로그램을 관리하는 프로그램을 만들자고 생각해서 만들어 보았다
사용자 삽입 이미지

생각보다 간단히 만들 수 있었다.

Find Windows를 클릭하면 실행중인 프로그램이 목록으로 뜨고 Show/Hide를 조정할 수 있다.

휴가 와서 이거랑 비트맵 깔짝대는거 한다고 하루는 사용한 것 같다.

아 내일 가는구나.. 기분이 착찹하다... 일단은 핵심 소스만

   i = SendMessage(hList,LB_GETCURSEL,0,0);
   SendMessage(hList,LB_GETTEXT,i,(LPARAM)str);
   tempHwnd = FindWindow(NULL,str);
   ShowWindow(tempHwnd,SW_SHOW);
Posted by 머리
Study - Programming/C/C++2007. 12. 8. 23:11
사용자 삽입 이미지

사용자 삽입 이미지


2007년 2학기 C 프로그래밍 텀 프로젝트인 러시안 테트리스이다.

참 고생 많이 했다.. 잘 알지도 못하는 MFC가지고 지지고 볶는다고.. 보면 Ver1과 모습이 좀 다르다. 블럭을 비트맵 처리하였고, 크기도 조금 줄였다.

하지만 Game클래스는 거의 변화하지 않아 만드는데 그렇게 힘들이지는 않았다. 실제로 이 버전은 하루만에 환성 할 수 있었다.

하지만 문제는 인공지능.. 진짜 머리 나쁘다. 이거 랜덤이랑 붙어도 질것 같다. 동생이랑 해서 6연패.. 심히 걱정된다. 일단 이정도로 해놓고 시험 공부좀 하고 인공지능을 업그레이드 시켜 보아야 겠다.

Posted by 머리
Study - Programming/C/C++2007. 11. 17. 02:28
사용자 삽입 이미지


2007학년도 2학기 C프로그래밍 과목의 텀 프로젝트 과제이다.

러시안 테트리르라고 불리는 게임인데(참고로 이렇게 해서 검색 해보면 한개도 안나온다.)

판에 테트리스 블록을 하나씩 놓으면서 상대방이 못놓게 하는게 이 게임의 목적. 즉 내가 마지막으로 블록을 놓으면 이기는 게임이다.

MFC를 이용하였다. 내 첫 MFC 프로그램인데, 생각보다 순조롭게 일이 진행되어서 다행이다. 현재까지는 버그가 없어보인다.

자 여기서 추가해야 할 것은 컴퓨터의 인공지능. 원래 목적은 여기서 컴퓨터가 놓을 수 있게 만들고, 학생들이 자신들이 만든 컴퓨터 인공지능을 붙여서 경쟁하는 것이 목적이다.

지금은 게임 룰만 되도록 하였다. 즉 인공지능은 없다. 이제 남은 기간동안 만들어야 할 것이다.

소스코드는 아직 텀 프로젝트 기간이므로 올리지 않고 실행 파일만 올린다.
Posted by 머리
Study - Programming/C/C++2007. 11. 6. 02:12

  Int Class에 이어 이번에 만들어 본 것은 String Class. C/C++에서의 문자열 처리를 보완하기 위하여 만들어 본 클래스이다. VB나 기타 다른 언어의 String형과 비슷하게 만들어 보았다.
구현한 것은 다음과 같다.

1. Constructors/Destructor
2. Adding Operator(+)
3. Equal Operator(==)
3. Assignment Operator(=)
4. Lenght Method
5. Standard IO Interface
  이렇게 나열하고 보니 몇가지 구현해보고 싶은게 많이 생기네.. Mid,Left,Right Method나 != Operator 같은것들.. 뭐 다음 기회로 미루자.

int Class 만들때보다 연산자 오버로딩을 좀 더 익숙하게 다룬 것 같다. 다음에 만들어 볼 것은 Matrix Class.

invalid-file

Class_String

Posted by 머리