받는 곳 : http://jira.public.thoughtworks.org/browse/CC

운영체제는 CentOs5.3
최신판인 cruisecontrol-bin-2.8.3 을 받았고, /cruisecontrol-bin-2.8.3 폴더에 압축을 풀었다.
ln -s /cruisecontrol-bin-2.8.3 /cruisecontrol 을 해서 바로 가기를 지정하였다.( 추후 버전 업그레이드시 쉽게 하기위해서)

압축을 풀고 내용을 보면
config.xml (프로젝트 를 여기서 추가)
cruisecontrol.sh (실행파일)
projects폴더 (프로젝트 폴더)
이외 여러가지 파일과 폴더들이 있다.

먼저, cruisecontrol.sh 을 편집해서 java 경로를 지정해 주어야 한다.
맨 아래에
EXE-"$JAVA_HOME/bin/java ~~~~
#JAVA_HOME/bin/java $CC_OPTS ~~~~
이렇게 되어있는데. 자신의 컴에 $JAVA_HOME 가 올바른 java경로로 설정이 되어있어야 실행이된다.

설정이 되어 있지 않다면,
vi ~/.bash_profile 해서
export JAVA_HOME="usr/java/jre1.6.0_13"
export JVAVA_HOME
를 추가 해주자. "" 안은 자신의 자바 경로 !
source ~/.bash_profile을 해서 적용 !

/cruisecontrol 폴더로 이동후
./cruisecontrol.sh & 을 해서 실행해보자. (&는 백그라운드 명렁어)

다음 웹브라우저를 실행하고
http://localhost:8080/dashboard 로 접속을 해보자.

CruiseControl의 Dashboard가 뜰것이다 !!

이상 설치 끝... (생각외로 설치는 간단함)

원문 :
http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.message_queue


메시지큐란 무엇인가?

메시지큐는 메시지들의 목록과 유사하다. 스레드들은 메시지들을 큐에 넣을 수 있고 큐로 부터 제거할 수도 있다. 각각의 메시지들은 또한 우선순위가 낮은 메시지들보다 먼저 수행될 수 있는 높은 우선순위와 같은 우선순위를 가진다. 각각의 메시지들은 몇가지의 특성을 가지고 있다.

  • 우선순위
  • 메시지의 길이
  • 데이터 (길이가 0보다 크다면)

스레드는 아래의 3가지 방법을 통해 메시지를 보내거나 받을 수 있다.

  • Blocking : 만약 송신시에 메시지큐가 가득찼다거나 수신시에 비었다면, 스레드는 새로운 메시지를 위한 공간이나 날때까지 또는 새로운 메시지가 생길때까지 멈춰(Blocked) 있을 것이다.
  • Try : 만약 송신시에 메시지큐가 가득찼다거나 수신시에 비었다면, 스레드는 그 즉시 에러를 리턴한다.
  • Timed : 만약 송신시에 메시지큐가 가득찼다거나 수신시에 비었다면, 스레드는 성공신호(성공적인 상태를 리턴) 혹은 중단신호(실패를 리턴)가 도착할때까지 행동을 재시도 한다.

메시지큐는 단지 프로세스들 사이에 raw bytes를 복사하고 개체(object)를 전송하지는 않는다. 이것은 만약 우리가 메시지큐를 이용하여 개체(object)를 전송하고 싶다면, 그 개체는 반드시 binary serializable 되어야 한다. 예를 들면, 우리는 프로세스들 사이에 정수(integer)를 전송할 수 있지만 std::string은 전송 할 수 없다. 이때는 Boost.Serialization 또는 Boost.Interprocess 라는 향상된 메커니즘을 사용해서 프로세스들 사이에 복합적인 데이터(complex data)를 전송해야 한다.

Boost.Interprocess 메시지큐는 프로세스간 통신이라고 불린다. 메시지큐는 이름을 사용해서 만들어지고 파일처럼 이름으로 불러온다. 메시지큐를 생성할 때, 사용자는 반드시 메시지의 최대 사이즈와 메시지큐를 저장할 수 있는 최대 메시지 수를 정의하여야 한다. 이러한 파라미터들은 리소스들을 정의 할 것이다.(한 예로, 공유메모리가 사용되고 있다면, 공유메모리(shared memory)의 크기는 메시지큐에 제공된다)
 

using boost::interprocess;
//Create a message_queue. If the queue
//exists throws an exception
message_queue mq
   (create_only         //생성 전용(only create)
   ,"message_queue"     //이름
   ,100                 //최대 메시지 수(max message number)
   ,100                 //최대 메시지 크기(max message size)
   );
using boost::interprocess;
//Creates or opens a message_queue. If the queue
//does not exist creates it, otherwise opens it.
//Message number and size are ignored if the queue
//is opened
message_queue mq
   (open_or_create      //읽기 또는 생성(open or create)
   ,"message_queue"     //이름(name)
   ,100                 //최대 메시지 수(max message number)
   ,100                 //최대 메시지 크기(max message size)
   );
using boost::interprocess;
//Opens a message_queue. If the queue
//does not exist throws an exception.
message_queue mq
   (open_only           //읽기전용(only open)
   ,"message_queue"     //이름(name)
   );


메시지큐는 정적함수 remove를 호출함으로서 명시적으로 제거된다.
using boost::interprocess;
message_queue::remove("message_queue");

이 함수는 만약 메시지큐가 여전히 다른 프로세스에 의해 사용되고 있을 경우 실패할 수 있다.


메시지큐 사용법

메시지큐를 사용하기 위해서는 다음의 헤더파일을 포함해야 한다.
#include <boost/interprocess/ipc/message_queue.hpp>

아래 예 처럼, 첫번째 프로세스가 메시지큐를 생성하고 거기에다가 정수 배열을 쓴다. 다른 프로세스는 단지 배열을 읽고 순서가 맞는지 확인한다. 이것이 첫번째 프로세스이다.
#include <boost/interprocess/ipc/message_queue.hpp>
#include <iostream>
#include <vector>

using namespace boost::interprocess;

int main ()
{
   try{
      //Erase previous message queue
      message_queue::remove("message_queue");

      //Create a message_queue.
      message_queue mq
         (create_only               //only create
         ,"message_queue"           //name
         ,100                       //max message number
         ,sizeof(int)               //max message size
         );

      //Send 100 numbers
      for(int i = 0; i < 100; ++i){
         mq.send(&i, sizeof(i), 0);
      }
   }
   catch(interprocess_exception &ex){
      std::cout << ex.what() << std::endl;
      return 1;
   }

   return 0;
}



이것이 두번째 프로세스이다.
#include <boost/interprocess/ipc/message_queue.hpp>
#include <iostream>
#include <vector>

using namespace boost::interprocess;

int main ()
{
   try{
      //Open a message queue.
      message_queue mq
         (open_only        //only create
         ,"message_queue"  //name
         );

      unsigned int priority;
      std::size_t recvd_size;

      //Receive 100 numbers
      for(int i = 0; i < 100; ++i){
         int number;
         mq.receive(&number, sizeof(number), recvd_size, priority);
         if(number != i || recvd_size != sizeof(number))
            return 1;
      }
   }
   catch(interprocess_exception &ex){
      message_queue::remove("message_queue");
      std::cout << ex.what() << std::endl;
      return 1;
   }
   message_queue::remove("message_queue");
   return 0;
}


이 클래스와 동작에 대해서 더 알고 싶다면
boost::interprocess::message_queue 클래스 참고를 보기바란다.
과자인줄 알고 받았던 실행파일이 바로 Advanced virus remover 였다.
그럴듯하게 백신 프로그램 형태를 하고 있지만,,, 돈 내라고 소리를 지르는 걸 보면 허위 백신 프로그램이다.
오히려 어떻게 해서든 겁을 주려고 띄우는 메시지를 보면 귀엽다.ㅎ

사용자 삽입 이미지


바탕화면이 파랗게 되고 되도 않은 경고 이미지가 붙어있다.
또한 레지스트리 편집기, 작업관리자, 도스창도 열리지 않는다. (계산기까지 못열리게 하는건 좀 심했다ㅠ)

외국에서 퍼지는 거라서 국내 검색을 찾으니 정보가 거의 없었다.

http://www.xdelbox.com/how-to-remove-advanced-virus-remover-free/

위 사이트를 참고로 해결을 하였다.
설명을 하자면,

1. 오른쪽마우스 새로만들기->텍스트 문서를 연다.

File::
c:\windows\system32\winupdate.exe
c:\windows\system32\winhelper.dll
c:\windows\system32\AVR09.exe
c:\Program Files\AdvancedVirusRemover\PAVRM.exe

 이렇게 작성을 하고 cfscript.txt 로 저장을 한다.

2. 위 사이트에 링크되어 있는 ComboFix.exe 를 cfscript.txt와 동일한 경로에 다운로드 받는다.

이때, 저장 이름을 Combo-Fix.exe로 하도록 한다. 왜 그런지는 모르겠으나 하라니 따라해야지 ~

3. txt 문서를 드래그 해서 Combo-Fix.exe 아이콘 위에다가 놓는다.

4. 띡띡소리가 나면서 뭔가를 분석을 할 것이다. 그럼 중간중간 확인을 눌러주면서 기다리면 된다.

돌아가는 것을 보니까 파일 삭제를 하고 윈도우 복구를 시켜주는 듯 했다.

나의 경우는 총 20분쯤 걸린것 같다 ~

과자받을때 조심해야지 ㅠ
트랜잭션(Transaction)은 ATM, 데이터베이스 등의 시스템에서 사용되는 쪼갤 수 없다는 업무처리의 단위이다.

영어의 Transaction은 거래를 뜻한다. 예를 들어 돈을 주었는데 물건을 받지 못한다면, 그 거래는 이루어지지 못하고 원상태로 복구되어야 한다. 이와 같이 쪼갤 수 없는 하나의 처리 행위를 원자적 행위라 고 한다. 여기서 쪼갤 수 없다는 말의 의미는 실제로 쪼갤 수 없다기보다는 만일 쪼개질 경우 시스템에 심각한 오류를 초래할 수 있다는 것이다. 이러한 개념의 기능을 ATM 또는 데이터베이스 등의 시스템에서 제공하는 것이 바로 트랜잭션이다.

트랜잭션은 사용자가 시스템에 요구를 시작하여 시스템 내의 처리, 시스템에서 사용자에게 응답하는 모든 처리를 포함한다. 이러한 트랜잭션이 충족해야 하는 기술적인 요건은 ACID가 있다.

출처 : 위키백과

http://ko.wikipedia.org/wiki/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98


1. 트랜잭션(transaction)
하나의 논리적 기능을 수행하기 위한 작업의 단위로서 데이타베이스의 일관된 상태를 또 다른 일관된 상태로 변환시킨다.

2. 트랜잭션 특성 (ACID)
(1). 원자성(Atomicity)
 트랜잭션은 자기의 션산을 전부 또는 전무(all or nothing) 실행만이 있지 일부 실행으로 트랜잭션의 기능을 갖는 것은 아니다.

(2). 일관성(Consistency)
 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이타베이스 상태로 변환한다. 즉, 트랜잭션 실행의 결과로 데이타베이스 상태가 모순되지 않는다.

(3). 격리성(Isolation)
 트랜잭션이 실행 중에 있는 연산의 중간 결과는 다른 트랜잭션이 접근할 수 없다.

(4). 영속성(Durability)
 트랜잭션이 일단 그 실행을 성공적으로 완료하면 그 결과는 영속적이다. 따라서 시스템은 어떤 경우에도 완료된 결과의 영속성을 보장해야 한다.

3. 트랜잭션 예 (계좌 이체)

T : Begin_Trans
       Read(A)
         A=A-100
       Write(A)
       Read(B)
         B=B+100
       Write(B)
     End_Trans

이 트랜잭션이 갖는 일관성 제약은, 이 트랜잭션이 실행되더라도 계좌 A와 계좌 B의 합계는 변하지 않아야 된다는 것이다.
A=A-100을 실행하고 B=B+100을 실행하는 도중 장애가 있어났다면 계좌 A와 계좌 B의 합계는 트랜잭션 T의 실행 전과 달라져 버리게 되어 일관성 제약을 위반하게 된다.
이러한 상태는 모순 상태(inconsistent state)라고 하는데 이러한 모순은 데이타베이스에서 허용되지 않는다.
원자성은 트랜잭션 실행의 시작에서부터 성공적으로 마칠 때까지를 한 단위로 해서 일관성을 검사하는 것이다.
원자성을 위한 연산에는 Commit(완료)와 Rollback(복귀) 연산이 있다.
Commit연산을 수행하면 그 트랜잭션의 실행이 성공적으로 종료되었음을 선언하는 것이다.
따라서 데이타베이스 상태는 일관성 있는 상태로 변환되었고 갱신된 데이타 아이템들의 값은 영속성을 갖도록 시스템이 보장하게 된다.
그러나 트랜잭션이 Rollback 연산을 수행하면 트랜잭션의 실행이 실패했음을 선언하는 것이다. 따라서 이 트랜잭션이 수행한 연산의 결과는 원상 복귀시켜야 된다.

4. 트랜잭션 상태
(1) 활동(active)
 트랜잭션이 Begin_Trans에서부터 실행을 시작하였거나 실행 중인 상태
(2) 부분완료(partially committed)
 트랜잭션이 마지막 명령문을 실행한 직후의 상태
(3) 실패(failed)
 정상적 실행을 더 이상 계속할 수 없어서 중단한 상태
(4) 완료(commited)
 트랜잭션이 실행을 성공적으로 완료하여 Commit 연산을 수행한 상태

BEGIN_TRANS;
       UPDATE
ACCOUNT
       SET Balace = Balance-100
       WHERE Accnt = 'A';
       IF ERROR GO TO UNDO;

       UPDATE
ACCOUNT
       SET Balace = Balance+100
       WHERE Accnt = 'B';
       IF ERROR GO TO UNDO;

       COMMIT
TRANS;
       GO TO
FINISH;

    UNDO:
       ROLLBACK
TRANS;
    FINISH:
       RETURN;

END_TRANS;

참고 & 출처 : 데이타베이스 시스템(DATABASE SYSTEM). 정익사. 이석호 저
C언어에서 포인터를 이해하는 것은 생각만큼 쉽지 않다.
포인터를 이해하지 않고 사용할 경우 생기는 위험성이 크고,
팀 작업의 경우 자신의 잘못된 포인터 사용으로 온종일 디버깅해야 하는 경우도 생길 수 있다.
포인터를 이용해서 참조 호출을 할 경우 원래의 값이 바뀌기 때문이다.

하지만 간단한 포인터 예제를 통해서 이해만 한다면 거부감이 조금은 사라질 것이다.

int age;
여기서 age는 변수명이고, int는 자료형이다.
32bit 에서 int는 4바이트이므로,
메모리상에서 어떤 4바이트 공간을 작업자는 age라고 부른다.
age = 26;
을 하게 되면 그 4바이트 공간에 26이라는 값이 들어가게 되고,
결국 age는 26이라는 값을 갖게 되는것이다.

int* p_age;
p_age라는 변수는 int* 라는 자료형이다.
*는 포인터, 즉 '가리키는'이라고 이해하면 쉬울 것 같다.
말을 풀어쓰면,
p_age는 메모리상의 int 자료형을 가리키는 변수이다.

그래서 p_age변수는 int형을 자료형을 가진 다른 변수의 주소값을 자신의 값으로 가진다.
p_age = &age;

age라는 변수의 메모리상 주소가 0xA 라고 했을때,
p_age는 0xA 라는 값을 가지게 된다.

*p_age = 30;
p_age의 값 (0xA) 가 가리키는 변수(age) 의 값을 30으로 쓴다.


void dGet_value2(void* *p2)
{
  printf("&p2:0x%04x\n", &p2);
  printf("p2:0x%04x\n", p2);
  printf("*p2:0x%04x\n", *p2);
  printf("\n");

  static int value = 5;
  *p2 = &value;
}

void dGet_value1(int* *p1)
{
  printf("&p1:0x%04x\n", &p1);
  printf("p1:0x%04x\n", p1);
  printf("*p1:0x%04x\n", *p1);
  printf("\n");

  dGet_value2((void **)&(*p1));
}
int _tmain(int argc, _TCHAR* argv[])
{
  int* pmain;
  printf("&pmain:0x%04x\n", &pmain);
  printf("pmain:0x%04x\n", pmain);
  printf("\n");

  dGet_value1(&pmain);

  printf("pmain-> %d\n",*pmain);
	return 0;
}

하나씩 설치하다가 잘안되서...
깔끔하게 APM_Setup 으로 설치하였다 ~! (XP환경)

[InnoDB]

1. InnoDB가 사용가능한지 확인해본다.

mysql> show variables like 'have_innodb';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_innodb   | YES   |
+---------------+-------+
1 row in set (0.00 sec)

!!! 여기서 Value에 Disable라고 뜬다면, my.ini를 열어서...
# BDB타입을 사용할지 하지 않을지
#skip-bdb <- 이부분 앞에 #으로 바꿔주고 mysql 재시작 하면 된다 ~


2. 설정 상태 확인한다.
mysql> show status like '%innodb%';
+-----------------------------------+---------+
| Variable_name                     | Value   |
+-----------------------------------+---------+
| Com_show_innodb_status            | 0       |
| Innodb_buffer_pool_pages_data     | 19      |
| Innodb_buffer_pool_pages_dirty    | 0       |
| Innodb_buffer_pool_pages_flushed  | 0       |
| Innodb_buffer_pool_pages_free     | 493     |
| Innodb_buffer_pool_pages_misc     | 0       |
| Innodb_buffer_pool_pages_total    | 512     |
| Innodb_buffer_pool_read_ahead_rnd | 1       |
| Innodb_buffer_pool_read_ahead_seq | 0       |
| Innodb_buffer_pool_read_requests  | 77      |
| Innodb_buffer_pool_reads          | 12      |
| Innodb_buffer_pool_wait_free      | 0       |
| Innodb_buffer_pool_write_requests | 0       |
| Innodb_data_fsyncs                | 3       |
| Innodb_data_pending_fsyncs        | 0       |
| Innodb_data_pending_reads         | 0       |
| Innodb_data_pending_writes        | 0       |
| Innodb_data_read                  | 2494464 |
| Innodb_data_reads                 | 29      |
| Innodb_data_writes                | 3       |
| Innodb_data_written               | 1536    |
| Innodb_dblwr_pages_written        | 0       |
| Innodb_dblwr_writes               | 0       |
| Innodb_log_waits                  | 0       |
| Innodb_log_write_requests         | 0       |
| Innodb_log_writes                 | 1       |
| Innodb_os_log_fsyncs              | 3       |
| Innodb_os_log_pending_fsyncs      | 0       |
| Innodb_os_log_pending_writes      | 0       |
| Innodb_os_log_written             | 512     |
| Innodb_page_size                  | 16384   |
| Innodb_pages_created              | 0       |
| Innodb_pages_read                 | 19      |
| Innodb_pages_written              | 0       |
| Innodb_row_lock_current_waits     | 0       |
| Innodb_row_lock_time              | 0       |
| Innodb_row_lock_time_avg          | 0       |
| Innodb_row_lock_time_max          | 0       |
| Innodb_row_lock_waits             | 0       |
| Innodb_rows_deleted               | 0       |
| Innodb_rows_inserted              | 0       |
| Innodb_rows_read                  | 0       |
| Innodb_rows_updated               | 0       |
+-----------------------------------+---------+
43 rows in set (0.00 sec)

Value에 설정된 값은 아마 my-innodb-heavy-4G.ini 를 편집하면 바뀔것 같다.
지금은 그냥 해보는게 중요해서..ㅎㅎ 건너뜀 ~ㅎ



3. 기존의 테이블 엔진 바꾸기
먼저 테이블 속성을 보자 ~

mysql> use testdb;
mysql> show table status where name='inno_test';
+-----------+--------+---------+------------+------+----------------+-----------
--+-------------------+--------------+-----------+----------------+-------------
--------+---------------------+------------+-----------------+----------+-------
---------+---------+
| Name      | Engine | Version | Row_format | Rows | Avg_row_length | Data_lengt
h | Max_data_length   | Index_length | Data_free | Auto_increment | Create_time
        | Update_time         | Check_time | Collation       | Checksum | Create
_options | Comment |
+-----------+--------+---------+------------+------+----------------+-----------
--+-------------------+--------------+-----------+----------------+-------------
--------+---------------------+------------+-----------------+----------+-------
---------+---------+
| inno_test | MyISAM |      10 | Fixed      |    1 |             65 |          6
5 | 18295873486192639 |         2048 |         0 |           NULL | 2009-11-20 1
5:20:35 | 2009-11-20 15:24:25 | NULL       | utf8_general_ci |     NULL |
         |         |
+-----------+--------+---------+------------+------+----------------+-----------
--+-------------------+--------------+-----------+----------------+-------------
--------+---------------------+------------+-----------------+----------+-------
---------+---------+
1 row in set (0.00 sec)

MyISAM 엔진이다. 이제 InnoDB로 변경 !!!

mysql> alter table inno_test type=innodb;
Query OK, 1 row affected, 1 warning (0.11 sec)
레코드: 1개  중복: 0개  경고: 0개

mysql> show table status where name='inno_test';
+-----------+--------+---------+------------+------+----------------+-----------
--+-----------------+--------------+-----------+----------------+---------------
------+-------------+------------+-----------------+----------+----------------+
----------------------+
| Name      | Engine | Version | Row_format | Rows | Avg_row_length | Data_lengt
h | Max_data_length | Index_length | Data_free | Auto_increment | Create_time
      | Update_time | Check_time | Collation       | Checksum | Create_options |
 Comment              |
+-----------+--------+---------+------------+------+----------------+-----------
--+-----------------+--------------+-----------+----------------+---------------
------+-------------+------------+-----------------+----------+----------------+
----------------------+
| inno_test | InnoDB |      10 | Compact    |    1 |          16384 |       1638
4 |               0 |        16384 |         0 |           NULL | 2009-11-20 15:
20:35 | NULL        | NULL       | utf8_general_ci |     NULL |                |
 InnoDB free: 4096 kB |
+-----------+--------+---------+------------+------+----------------+-----------
--+-----------------+--------------+-----------+----------------+---------------
------+-------------+------------+-----------------+----------+----------------+
----------------------+
1 row in set (0.00 sec)

InnoDB로 변경이 되었다 ~

4. 트랜잭션. rollback, commit 해보기

mysql> select * from inno_test;
+------+------+
| a    | b    |
+------+------+
|    2 | cho  |
+------+------+
1 row in set (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update inno_test set a=3;
Query OK, 1 row affected (0.00 sec)
일치하는 Rows : 1개 변경됨: 1개  경고: 0개

mysql> select * from inno_test;
+------+------+
| a    | b    |
+------+------+
|    3 | cho  |
+------+------+
1 row in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.03 sec)

mysql> select * from inno_test;
+------+------+
| a    | b    |
+------+------+
|    2 | cho  |
+------+------+
1 row in set (0.00 sec)

업데이트 쿼리를 하기전에 begin;을 입력하고 쿼리를 수행하면,
실제 데이터가 바로 바뀌지 않는다.
commit; 이 들어오면 실제로 바뀌게 되고 rollback;이 들어오면 적용하지 않게 된다.
이제는 commit;을 해보자.

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update inno_test set a=3;
Query OK, 1 row affected (0.00 sec)
일치하는 Rows : 1개 변경됨: 1개  경고: 0개

mysql> select * from inno_test;
+------+------+
| a    | b    |
+------+------+
|    3 | cho  |
+------+------+
1 row in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.03 sec)

mysql> select * from inno_test;
+------+------+
| a    | b    |
+------+------+
|    3 | cho  |
+------+------+
1 row in set (0.00 sec)

적용이 되었다 ~
트랜잭션에 대해서 좀 더 공부해야겠다 ~~~!

vim 편집기로 작업을 하다가 나도 모르게 컨트롤 Z를 눌러버리니...
바로 백그라운드 작업이 되어버렸다...
다시 vim 으로 편집할려고 하니 읽기전용이 되어 버렸네 ㅠ
kill 로 죽여도 죽은게 아닌듯한 느낌? ㅎ

그래서 명령어를 찾았다 ~~!!

bg : 백그라운드 작업 보기
fg : 백그라운드 작업으로 이동 (포워드그라운드 인가? ㅎ)


#include 
#include 
using namespace std;
int main()
{
int result, sum = 10, divisor=0;
result = sum / divisor;
cout << "Result = " << result << endl;
return 0;
}


위의 코드는 컴파일러가 제수가 0이 되는 에러를 잡지 못한다.
이럴때 assert()를 사용해서 false가 될경우 프로그램이 종료되게 할 수 있다.

#include 
#include 
using namespace std;
int main()
{
int result, sum = 10, divisor=0;
assert(divisor!=0);
result = sum / divisor;
cout << "Result = " << result << endl;
return 0;
}


Output
===================================================================================
t: t.cpp:8: int main(): Assertion `divisor!=0' failed.
Disallowed system call: SYS_kill
===================================================================================

assert() 코드 기능을 사용하고 싶지 않다면 #include 위에
#define NDEBUG 를 넣어주면 된다.


+ Recent posts