티스토리 뷰

Application/C/C++

nCurses 페이스북 그룹 내용 백업

drake_kr drake_kr 2014. 5. 4. 14:20

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

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


기본적인 화면 구성은 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
nCurses 페이스북 그룹 내용 백업  (0) 2014.05.04
객체지향의 이해  (0) 2014.04.04
Source Insight 3.5  (0) 2014.02.17
배열 초기화  (1) 2013.08.17
댓글
댓글쓰기 폼