티스토리 뷰

여러가지 대안들이 있으며, 활동하기에 어려운 점이 있어 폐쇄함.

일단 거기서 나온 이야기는 백업.


기본적인 화면 구성은 curses.h 만 가지고도 가능하다.

ncurses는 curses.h의 wrapper.


윈도우에서는 PDCurses를 사용할 수 있다.

Visual C++에서 사용가능


<pre>

/* Hello Curses on Windows */

#include <tchar.h>
#include <curses.h>

int _tmain(int argc, _TCHAR* argv[])
{
  initscr();
  mvprintw(10,20,"Hello, Curse");
  refresh();
  getchar();
  endwin();
  return 0;
}

</pre>


문자 'A'와 문자열 "A"는 다르다. 선언해야 할 Type이 다름!


테트리스와 인베이더의 만남

http://www.oldschoolapps.com/arcade/flash-games/1443-retro-mash-tetris-meets-space-invaders


레퍼런스

https://wiki.kldp.org/wiki.php/NCURSES-Programming-HOWTO


포인터를 이용해서 메모리 내용을 보여주는 프로그램을 만들었습니다. 아직 ncurses로 만들어 지지 않았구요.. 만든다면 창을 하나 띄워서 주소 검색등을 해보게 할 수 있겠네요.

<pre>

// 포인트를 이용하여, 메모리 주소값과 주소를 출력하시오.
#include <stdio.h>

int main()
{

  //char word[30] = "hello"; // 문자열의 저장방식을 보기 위해 문자열 선언과 대입.
  //int A = 0xabcdef88; // 스택구조상 메모리의 흐름을 보기위해 변수 선언과 대입.
  int i_num = 0xAA; // 알아보기 쉽도록 16진수로 값을 넣어둔다.
  int i_cnt; // 기본적인 for 문을 위한 카운터 변수.
  int i_loop;
  unsigned char *ucp = (unsigned char *)&i_num; // 가르키는 선언 값에 따라 올바르게 타입을 캐 스팅.
  printf("-------------------------------------------------------------------------------------------\n" "Address ");

  // 안내 주소를 00부터 0F까지 출력 시작.
  for(i_cnt = 0;i_cnt <= 15;++i_cnt)
  {
    printf("%02X ", i_cnt);
  }
  // 안내 주소 출력 끝.
  printf(" ASCII\n");

  // 주소와 메모리 출력 시작.
  for(i_loop = 0; i_loop <= 10;++i_loop) // i_loop 값의 변경으로 몇줄을 뽑을지 정할 수 있다.
  {
    printf("%08X ", ucp); // 주소 출력.

    for(i_cnt = 0;i_cnt <= 15;++i_cnt) // 저장된 값을 16진수로 두 글자씩만 출력하고 .
    {
      printf("%02X ", *(ucp + i_cnt));
    }

    // ASCII 문자를 출력 시작.
    for(i_cnt = 0;i_cnt <= 15;++i_cnt)
    {
      if(' ' <= *((signed char*)ucp + i_cnt)) // ASCII 코드 출력시 입력문자가 있을 경우 도트를 출력한다.
      { // 그 외 아스키문자중 제어문자의 마지막인 스페이스보다
        printf("%c", *(ucp + i_cnt));
      }
      else
      {
        putchar('.');
      }
    }
    printf("\n");
    // ASCII 문자를 출력 끝.

    ucp = ucp + 16; // 다음 줄의 메모리 주소를 계산후 대입.
  }
  return 0;
}

</pre>


<pre>

  // 처음 선언되는 변수의 주소값을 기준으로 16 x 10의 16진수 메모리 맵을 출력한다.
// 포인터 변수의 주소 연산과 포인터 변수가 가리키는 값의 주소를 출력하는 것이 목적이다.
// 보기 좋은 화면을 위해 기준이 되는 변수의 마지막 1바이트 값을 가이드 주소로 출력되게 했다.
// 간단한 파일 출력을 동시에 수행한다. memory_status.txt 라는 파일을 만들어 결과를 저장한다.
//
// 주석을 명료하며 되도록이면 다른 사람이 보고 이해하기 쉽도록 적었다.
// 2012년 5월 11일.
#include <stdio.h>

int main()
{

int i_loop;
int i_num = 0xABCDEF88;
int i_cnt;

FILE *fpout; // 파일 포인터 변수 선언.

unsigned char *c_num_ptr = (unsigned char *) &i_num;

fpout = fopen("memory_status.txt", "w"); // fpout 변수에 텍스트파일을 쓰기가 가능하게 불러온다.

// 가이드 문구 시작.
printf("---------------------------------------------------------------------------------\n"
" Address ");

// 주소 마지막 바이트 출력 시작 : 불러들인 주소의 마지막 한 바이트를 알아보기 쉽게 띄워준다.
for(i_cnt = 0;i_cnt <= 15;++i_cnt)
{
printf("%02X ", ((unsigned char)c_num_ptr + i_cnt));
//fprintf(fpout, "%02X ",((unsigned char)c_num_ptr + i_cnt));
}
// 주소 마지막 바이트 출력 끝.

printf(" ASCII CODE \n");
//fprintf(fpout, "\n", i_num);
// 몸체 시작. : 주소와 해당 주소의 실제값을 1 바이트 단위로 출력, 아스키 코드 표시.
for(i_loop = 0;i_loop <= 10;++i_loop) // 몇 줄의 주소를 띄울 것인가를 i_loop의 비교값으로 결정.
{
printf("%08x ", c_num_ptr); // 주소 출력
fprintf(fpout, "%08x ", c_num_ptr); // 텍스트 파일 출력.

// 1바이트씩 주소 값을 출력 시작. :
for(i_cnt = 0;i_cnt <= 15;++i_cnt)
{
printf("%02x ", *(c_num_ptr + i_cnt));
fprintf(fpout, "%02x ", *(c_num_ptr + i_cnt)); // 텍스트 파일 출력.
}
// 1바이트씩 주소 값을 출력 끝. :

// 값에 대한 아스키 코드 출력 시작.
for(i_cnt = 0;i_cnt <= 15;++i_cnt)
{
if(' ' < *(((signed char *)c_num_ptr) + i_cnt)) // 제어문자 스페이스의 십진수 값은 32.
{ // 이 값보다 출력 값이 크면 해당 아스키를 뿌리는데 이때
printf("%c", *(c_num_ptr + i_cnt)); // 제대로 표현할 확장 아스키를 걸러주기 위해 signed char 캐스팅.
fprintf(fpout, "%c", *(c_num_ptr + i_cnt)); // 텍스트 파일 출력.
}
else
{
putchar('.'); // 아스키값이 32 미만이거나 127 이상일 경우에는 점(도트)를 찍어준다.
fprintf(fpout,"."); // 텍스트 파일 출력.
}
}
printf("\n"); // 한줄이 끝나고 개행(줄바꿈)
fprintf(fpout, "\n"); // 텍스트 파일 출력.
c_num_ptr = c_num_ptr + 16; // 다음 줄의 올바른 주소값은 위에서 16바이트를 출력했으니 다음줄은 기준이 되고 있는 첫바이트> 보다 16이 많다.
}
fclose(fpout); // 파일을 닫아준다.
return 0;

</pre>


터미널에서 어떤 프로그램 실행하다 죽거나 취소했을때 터미널이 병신이 되면?

#stty sane



'Application > C/C++' 카테고리의 다른 글

2015년 3월 22일 과제  (0) 2015.03.29
QtNetwork를 사용하려면  (0) 2014.10.23
객체지향의 이해  (0) 2014.04.04
Source Insight 3.5  (0) 2014.02.17
배열 초기화  (1) 2013.08.17