반응형

cpp list class

리스트는 순서있는 컨테이너. 어느 위치라도 추가/삭제가 용이함. 더블 링크드 리스트로 구현.

#include <list>


+constructor

-empty container constructor

list(const allocator_type& alloc=allocator_type()) ;

-fill constructor

list(size_type n, const value_type& val, const allocator_type& alloc =allocator_type())

-range constructor

list(inputiterator first, last, alloc=allocator_type()) ;

-copy const.

list(const list& x, alloc=null) ;

-move const.

list(list &&x, alloc=null) ;

-initializer list const.

list(initializer_list<value_type> il, alloc=allocator_type()) ;


std::list<int> first ;

std::list<int> second (4, 100) ;    // 4개, 100의 값으로 채움.

std::list<int> third( second.begin(), second.end() ) ;

std::list<int> fourth (third ) ;

int arr1[]={1,2,3,4} ;

std::list<int> fifth( arr1, arr1+sizeof(arr1)/sizeof(int) ) ;


+일반적인 메소드

size() ; 요소 개수

back(), front() ; 마지막, 처음 원소 값.

begin(), end() ; iterator, 앞에 c를 붙이면 const type.

rbegin(), rend() ; reverse iterator, 앞에 c를 붙이면 const.

insert()

erase()


+수정

push_back(), pop_back()

push_front(), pop_front() ; 앞에서 추가할 수도 있다. (벡터는 앞에 추가하려면 .insert( .begin() , ..)을 사용해야 한다. )

emplace(), emplace_back(), emplace_front()

std::list< std::pair<int, char> > mylist ;

mylist.emplace_back( 10, 'a') ;

mylist.emplace_front( 20, 'b') ;

mylist.emplace( mylist.begin(), 100, 'x') ;

for (auto &x : mylist)  std::cout << x.first << ":" << x.second <<  "\n" ;

+reverse()

순서를 뒤집는다.


+sort()

정렬 ; 파라미터를 주지 않으면 디폴트로 오름차순 정렬된다.


bool compare_nocase(const std::string &first, const std::string &second) {

unsigned int i=0; 

while ( (i<first.length()) && (i<second.length()) ) {

  if ( tolower(first[i]) < tolower(second[i])) return true ;

  else if ( tolower(first[i]) > tolower(second[i]) ) return false ;

  ++i ;

}

return ( first.length() < second.length() ) ;

}

mylist.sort( compare_nocase ) ;



+unique()

중복 값을 가진 노드들을 제거한다.

mylist.sort() ;

mylist.unique() ;

mylist 출력 : 중복된 값들이 제거되고 오름차순으로 출력됨. 


중복의 범위를 정하는 함수 사용.

struct is_near { 

  bool operator() (double first, double second) {  return  (fabs(first-second) < 5.0 ) ; } 

} ;

mylist.unique( is_near() ) ; // 5.0 미만의 차이는 중복으로 보고 중복 제거한다. 


+=operator

내용을 모두 복사함.


+assign()

할당. 새로운 리스트의 내용으로 덮어쓴다. 

assign( inputiterator first, last)

assign(size_type n , const value_type &val) ;

assign( initializer_list<value_type> il) ;

std::list<int> first ;

first.assign(7, 100) ;    // 7개를 100으로 채움.

second.assign( first.begin(), first.end() ) ;


+ remove() ;특정 값을 찾아 요소를 삭제한다.

remove( const value_type & val) ;

erase()는 위치를 파라미터로 주고 삭제하는 것이고, remove()는 값을 찾아 삭제해 준다.


+remove_if() ; 조건에 따른 삭제.

struct is_odd {

bool operator() ( const int&value ) {  return (value%2)==1; } 

} ;

mylist.remove_if(is_odd()) ;        // 홀수를 제거한다.



+splice() ; 리스트를 다른 리스트로 이동. (copy가 아님)

-전체 ; splice( const_iterator position, list &x) ;

    splice(const_iterator position, list && x) ;

-한 개 ; splice( position, list &x, const_iterator i) ;

-범위 ; splice( position, x, first, last) ;

x에서 지정된 위치의 범위를 지정된 위치로 전송/삽입한다.

mylist = 1,2,3,4

mylist2 = 10,20,30

it = mylist.begin()+1 ;

mylist1.splice(it, mylist2) ;    // 1 10 20 30 2 3 4 , mylist2는  empty가 된다. (전송되었으므로.) 위에서 지정한 it는 여전히 2를 가리키므로 위치가 begin()+4 위치로 된다. 

mylist2.splice(mylist2.begin(), mylist1, it) ; // mylist2=2  ,   mylist=1 10 20 30 3 4 (2가 이동됨.)

it = mylist.begin()+3 ;

mylist.splice( mylist.begin(), mylist, it, mylist1.end() ) ; // 30 3 4 1 10 20


+merge() ; 병합. x의 데이터가 transfer 이동 됨.  splice()와 비슷하나 순서에 맞게 들어간다.

merge(list& x) ;

merge(list &x, Compare comp) ;

first.sort() ;

second.sort() ;

first.merge(second) ;    // second는 empty가 된다. second의 요소들이 first에 순서에 맞게 전부 추가됨.

first.merge(second, mycomparison) ;

bool mycomparison(double first, double second) {  return ( int(first) < int(second)) ; }














'Develop > C&CPP' 카테고리의 다른 글

string  (0) 2018.05.30
map  (0) 2018.05.29
Array 1  (0) 2018.05.25
Vector 3  (0) 2018.05.23
Vector 2  (0) 2018.05.18
반응형

cpp array class

fixed size의 순서있는 컨테이너. 선형적 연속으로 순서있게 요소들이 배열된다.

다른 표준 컨테이너들과는 달리 고정된 크기이고 요소들의 메모리 할당을 관리하지 않는다.

동적인 확장이 불가능하다. zero-size 도 가능하지만 dereference할 수는 없다.

#include <array>


+이터레이터 함수.

begin(), end(), rbegin(), rend(), cbegin(), cend(), crbegin(), crend()

사용 방법은 벡터와 같다.

+용량 함수

size() ; 요소 개수

max_size(); 최대 개수. array에서는 size()와 같다. 

empty() ; 비었는지 확인. true/false

+요소 접근

[] operator

at()

front(); 처음 요소값을 참조로 리턴

back() ; 마지막 요소값을 참조로 리턴

data() ; 데이터 포인터를 얻어온다.

+수정

fill() ; 특정 값으로 채운다.

swap() ; 같은 타입인 두 개의 배열을 서로 바꾼다. (같은 크기여야 한다. 다른 크기면 컴파일 에러)


+at과 []의 차이점.

둘 다 주어진 인덱스의 요소를 참조로 리턴한다. at은 파라미터로 주어진 인덱스가 범위를 벗어나면 out_of_range exception이 발생한다. [] operator에서는 범위를 벗어나면 프로그램이 죽는다.(범위체크가 없음. 수동으로 해줘야 함.)


std::array<int, 10> arr1 ;

for (int i=0; i<10; i++) arr1.at(i)=i+1 ;    // 1부터 10까지 할당

std::cout << arr1.front() << std::endl ;    // 첫 번째 요소 값 출력. 1

std::cout << arr1.back() << std::endl ;    // 마지막 요소 값 출력. 10

arr1.front() =100 ;    // 첫 번째 요소에 100을 할당. 1 대신 100으로 덮어씀.

arr1.back() = 50 ;    // 마지막 요소에 50을 할당. 10대신 50으로 덮어씀.


const char* cstr="Test string";    // 11자 alpha+1 null char.

std::array<char,12> arr2 ;

std::memcpy(arr2.data(), cstr, 12) ;

std::cout << arr2.data() << std::endl ;    // 위 스트링이 출력됨.


std::array<int, 6> arr1 ;    // int 타입 6개 크기 배열을 생성.

arr1.fill(5) ;    // 5로 전부 채움.


std::array<int, 5> f = {1,2,3,4,5} ;

std:;array<int, 5> g={10,20,30,40,50} ;

f.swap(g) ;    // f, g를 바꿈.

for (int &x : f) std::cout << x << '  ' ;        // 모든 원소 출력. 10 20 30 40 50

std::cout<<'\n' ;


참고) std::fill_n( 위치, 개수, 값) ; 특정 위치에서 n개를 특정 값으로 채움.

fill_n( OutputIterator first, Size n , const T & val) ;

std::vector<int> v1(8, 10) ;    // 8개 10으로 다 채움.

std::fill_n(v1.begin(), 4, 20) ;    // 처음부터 4개를 20으로 채움. 20,20,20,20,10,10,10,10

std::fill_n(v1.begin()+3, 3, 33 ) ;    // 인덱스3번 위치부터 3개를 33으로 채움. 20, 20, 20, 33, 33, 33, 10, 10





'Develop > C&CPP' 카테고리의 다른 글

map  (0) 2018.05.29
List 1  (0) 2018.05.28
Vector 3  (0) 2018.05.23
Vector 2  (0) 2018.05.18
Vector 1  (0) 2018.05.16
반응형

Vector 3 추가/삭제/변경


-swap

같은 타입의 두 벡터의 엘리먼트들을 바꾼다. 크기는 상관없다.

std::vector<int> foo(3,100) ;     // 100을 값으로 갖는 요소 3개

std::vector<int> bar(5, 200) ;    // 300을 값으로 갖는 요소 5개


foo.swap(bar);    // foo와 bar 두 개의 벡터들이 서로 바뀐다.

foo ; ==> 200 200 200 200 200

bar ; ==> 100 100 100


-push_back ; 벡터 마지막에 요소 추가. 복사(새롭게) 추가됨. 벡터 크기가 자동으로 증가. 메모리도 부족하면 자동으로 추가 할당됨.

std::vector<int> v1 ;

v1.push_back(100) ;

v1.push_back(200) ;

-pop_back ; 벡터 마지막 요소를 제거한다. 리턴값 없음.

마지막 요소값을 확인하려면 pop_back()하기 전에 back()으로 확인 가능.

while( !v1.empty() ) {

   sum+=v1.back() ;

  v1.pop_back() ;

}

v1벡터가 빌때까지 하나씩 요소들을 제거함. 요소 제거 전에 제거할 값을 얻어 총 합을 구한다.


-insert

특정 위치가 새로운 요소를 삽입한다.

insert ( const_iterator position,  const value_type & val) ;

insert( " , size_type n, const value_type &val) ;

insert(", InputIterator first, InputIterator last) ;

insert(", value_type&& val) ;

insert(", initializer_list<value_type> il) ;

리턴값 ;새로 추가한 첫번째 요소 위치 이터레이터

std::vector<int> v1(3,100) ;    // 100 100 100

std::vector<int>::iterator it ;

it = v1.begin() ;

it = v1.insert(it, 200) ;    // 200 100 100 100

v1.insert(it, 2, 300) ; // 300 300 200 100 100 100 

std::vector<int> v2(2, 400) ;    // 400 400 

v1.insert(v1.begin()+2, v2.begin(), v2.end()) ;    // 300 300 400 400 200 100 100 100 

(v2.end() 전 위치까지만 추가함).

int arr[]={501,502,503};

v1.insert(v1.begin(), arr, arr+3 ) ;    // 501 502 503 300 300 400 400 200 100 100 100 

 (arr+3 전 위치까지 추가함.)


 -erase

특정 위치 또는 위치 범위의 요소들을 제거

v1.erase(v1.begin()+5) ;    // 6번째 요소를 제거함. (인덱스는 0부터시작)

v1.erase(v1.begin(), v1.begin()+3) ;    // 앞에서 부터 3개를 제거. (두 번째 파라미터로 지정한 위치 전까지만 제거됨)

-clear ; 전체 요소 삭제


-emplace

할당과 삽입. insert는 복사하여 삽입이지만, emplace는 할당된 것을 그대로 사용하여 성능면에서는 낫다.

std::vector<int> v1={10,20,30} ;

auto it = v1.emplace(v1.begin()+1, 100) ;    // 10, 100, 20, 30

v1.emplace(it, 200) ;    // 10, 200, 100, 20, 30

v1.emplace(v1.end(), 300) ;    // 10, 200, 100, 20, 30, 300


-emplace_back

push_back()과 거의 똑같다. push_back()은 복사하여 사용하는데, emplace_back은 construct 한 것을 그대로 사용하기 때문에 성능면에서 좀 낫다.

v1.emplace_back(100);    // v1 마지막에 100 추가.





'Develop > C&CPP' 카테고리의 다른 글

List 1  (0) 2018.05.28
Array 1  (0) 2018.05.25
Vector 2  (0) 2018.05.18
Vector 1  (0) 2018.05.16
정규식으로 스트링 일부 추출하기  (0) 2018.03.10
반응형

cpp Vector 2


+ vector의 element 탐색

-std::vector::begin

첫번째 엘리먼트를 가리키는 이터레이터를 리턴한다.

컨테이너가 empty이면 리턴값은 dereference할 수 없다.

-std::vector::end

마지막을 지난 엘리먼트의 위치를 가리키는 이터레이터를 리턴한다.

past-the-end 엘리먼트는 벡터의 마지막 엘리먼트 뒤의 이론적 엘리먼트다. 따라서 dereference할 수 없다.

컨테이너가 empty이면 리턴값은 vector::begin의 리턴값과 같다.


ex)

std::vector<int> my ;

for (int i=1; i<=5; i++) my.push_back(i) ;

for(std::vector<int>::iterator it=my.begin(); it!=my.end(); ++it) 

   std::cout << " " << *it ;

my vector의 모든 엘리먼트 탐색하여 출력. 1,2,3,4,5


+ 역방향 탐색

vector::rbegin()    ,   vector::rend()

int i=0 ;

std::vector<int> my(5) ; 

std::vector<int>::reverse_iterator rit = my.rbegin() ;

for (; rit!=my.rend(); ++rit)  *rit = ++i ;

출력하면 5,4,3,2,1 을 갖는다.


+첫번째 값, 마지막 값

vector::front()    , vector::back()

begin(), end()는 iterator로 위치를 의미하지만, front(), back()은 위치가 아니라 엘리먼트의 값을 참조로 리턴한다.

std::vector<int> my ;

my.push_back(50) ;

my.push_back(20) ;

my.front() -= my.back() ;    // 첫번째 엘리먼트에 첫번째 - 마지막 값으로 할당한다.

std::cout << my.front() << std::endl ;

첫번째 값이 30으로 변경되어 30이 출력된다.


std::vector<int> my ;

my.push_back(10) ;

while ( my.back()!=0 ) my.push_back(  my.back() -1 ) ;

출력하면 10, 9, 8, ..., 2, 1, 0


+const iterator

vector::cbegin()        vector::cend()

vector::crbegin()        vector::crend()

begin(), end()와의 차이점은 리턴값이 const_iterator 로써 iterator를 통한 엘리먼트의 값을 변경할 수 없다. (*it=value --> compile error)

+data

value_type *data()

첫번째 엘리먼트 배열 메모리의 포인터를 리턴한다.  벡터는 엘리먼트들이 연속적인 메모리에 위치되도록 보장한다. 따라서 주소로 접근 가능.

std::vector<int> my(5) ;

int *p = my.data() ;

*p=10 ;

p++ ;

*p=20 ;

p[2]=40 ;

출력하면 10, 20, 0, 40, 0


+ [] operator

벡터의 n번째 위치의 엘리먼트를 참조로 리턴한다.

my[i] 이렇게 배열처럼  읽고 쓰기가 사용가능.




 



'Develop > C&CPP' 카테고리의 다른 글

Array 1  (0) 2018.05.25
Vector 3  (0) 2018.05.23
Vector 1  (0) 2018.05.16
정규식으로 스트링 일부 추출하기  (0) 2018.03.10
gdb로 디버깅하기  (0) 2018.03.06
반응형

cpp의 vector (std::vector)


크기를 변경할 수 있는 배열로 표현된 컨테이너

배열처럼 인덱스로 접근이 가능.

배열과 다르게 동적으로 크기 변화가 되며 메모리가 자동으로 관리

엘리먼트들의 순서가 있는 컨테이너. 엘리먼트의 위치 인덱스로 접근

#include <vector>


+초기화

std::vector<int> a1;    // 빈 객체

std::vector<int> a2(4, 100) ; // 100의 값을 갖는 엘리먼트들을 4개만들어 초기화.

std::vector<int> a3(a2.begin(), a2.end());  // a2의 이터레이터를 통한 복사.

std::vector<int> a4(a3) ;     // a3 복사

 

-배열을 복사

int array1={1,2,3,4,5} ;

std::vector<int> a5(array1, array1+sizeof(array1)/sizeof(int)) ;  // 두 번째 파라미터는 배열의 마지막 노드의 다음 노드의 포인터.

-출력/탐색

for(std::vector<int>::iterator it = a5.begin(); it!=a5.end(); it++)

    std::cout << " " << *it ;    // *it ; 이터레이터가 가리키는 엘리먼트의 값.(int)

=>  a5.end()는 a5의 마지막 노드의 위치 다음으로 끝을 가리키는 위치로 볼 수 있다. 따라서 위에서 마지막까지 빠짐없이 전체의 값을 출력할 수 있다.


+ 복사

= operator : 다른 컨테이너의 내용을 기존 내용에 덮어쓴다. (크기도 수정됨.)

std::vector<int> a1(3, 0) ;

std::vector<int> a2(5, 0) ;

a2 = a1 ;

a1=std::vector<int>();

a2의 크기는 5에서 3으로 변경되고, 기존 a1의 elements들로 바뀜.

a1은 다시 초기화하여 empty가 된다.


+할당

assign()

std::vector<int> a1, a2, a3 ;

a1.assign(5, 1) ;    // 5개의 노드를 만들고, 전부 1로 초기화.

std::vector<int>::iterator it = a1.begin()+1 ;    // a1의 두 번째를 가리킴.

a2.assign( it, a1.end()-1 ) ; //위의 이터레이터 부터 a1의 끝 하나 전까지 a2로 할당(복사). a1에서 앞, 뒤 하나씩뺀 3개가 복사됨.

a3.assign( arr1, arr1+3 ) ;   // arr1 배열에서 3개를 복사.


+벡터 크기와 크기 변경.

-벡터의 크기.

a1.size();   // 엘리먼트의 개수를 리턴함.

-벡터의 용량

a1.capacity();    // 메모리가 할당된 크기. (엘리먼트 크기 단위)

capacity는 size와 다를 수 있다. 실제 데이터 크기보다 메모리를 reserve로 더 많이 할당될 수도 있다.  (  size <= capacity )

벡터는 데이터 추가시에 알아사 자동으로 메모리가 확장되기 때문에 할당문제를 고려할 필요가 없지만 성능상 미리 메모리 할당이 필요한 경우 reserve()를 통해 최대로 받을 아이템 개수를 파라미터로 설정해 두는 것도 좋다.


-벡터 크기 변경

void resize(size_type n ) ;

void resize(size_type n , const value_type &val) ;

벡터의 크기를 n으로 변경. 현재 컨테이너 크기보다 작게 설정하면, n개의 엘리먼트까지만 유효하다. (나머지는 삭제).

현재 컨테이너 크기보다 크게 설정하면, 기존 데이터를 유지하고 크기가 확장. val값을 지정하면 해당 값으로 채운다.

현재의 capacity보다도 크면, 알아서 메모리 할당까지 해준다.

std::vector<int> a1 ;

for(i=0 i<10; i++) a1.push_back(i) ;    // 0~9까지 10개의 노드 추가.

a1.resize(5);    // 크기를 5로 지정. 데이터는 0~4까지만 존재.

a1.resize(8, 10);    //크기를 8로 확장. 뒤에 3개의 공간이 더 생기고 10으로 초기화됨.

a1.resize(12);     // 크기를 12로 확장. 뒤에 4개의 공간이 더 생기고 빈 값(0으로 초기화).

a1 전체 출력

for (int i=0; i<a1.size(); i++) std::cout << " " <<a1[i] ;

0 1 2 3 4 10 10 10 0 0 0 0 








'Develop > C&CPP' 카테고리의 다른 글

Vector 3  (0) 2018.05.23
Vector 2  (0) 2018.05.18
정규식으로 스트링 일부 추출하기  (0) 2018.03.10
gdb로 디버깅하기  (0) 2018.03.06
mutex 동기화 예제  (1) 2018.03.06
반응형


+정규식으로 스트링의 일부를 찾아 추출한다.



cpp 정규식 검색/매칭

- 스트링에서 특정 class명으로 나온 태그에서 href의 url 부분만 추출하기.
-1단계
class="i-e" 로 시작하고, <, > 문자가 나오기 전까지 중간 부분 추출.
-2단계
추출된 부분에서 href=으로 시작하고 ", " 사이에 있는 중간 부분 추출.

regex_search() 함수로 찾는다. match 결과의 [0]은 패턴이 맞는 부분의 전체 스트링을 추출.
[1], [2], 등은 그 다음에 패턴에서 ()로 싸인 부분 순서대로 추출.


#include <iostream>

#include <string>

#include <regex>

using namespace std ;

string html="<a class=\"i-e\" href=\"DATA IM INTERESTED IN\">\n\

<a class=\"chrome\" href=\"nono chrome\">\n\

<a class=\"i-e\" href=\"ie like1\">\n\

<a class=\"chrome\" href=\"nono chrome\">\n\

<a class=\"i-e\" href=\"ie like2\">\n\

<a class=\"chrome\" href=\"nono chrome\">\n\

<a class=\"chrome\" href=\"nono chrome\">\n\

<a class=\"i-e\" style=\"font-size:10pt;\" href=\"ie like3\">\n\

<a class=\"chrome\" href=\"nono chrome\">\n\

<a class=\"chrome\" href=\"nono chrome\">\n\

<a class=\"i-e\" href=\"ie like4\"> <a class=\"i-e\" href=\"ie like5\">\n\

";

int main() {

smatch m, m2 ;

regex e ( "class=\"i-e\"([^<>]+)>" ) ; // get: href="ie like"

regex e2 ( "href=\"(.+)\"" ) ; // get ie like

bool r, r2 ;

string content ;

int start=0 ;

cout << "input html : " << html << endl ;

do {

content = html.substr(start) ;

// cout << "content:"<<content<<endl;

r=regex_search(content, m, e) ;

if ( r ) {

// cout << "search: " << r << endl ;

// cout << "str: " << m.position() << " "<< m.str() << endl ;

cout << "match : " << m[1] << endl ;

r2 = regex_search((string)m[1], m2, e2) ;

if ( r2 ) {

cout << " URL : " <<m2[1]<<endl ;

}

}

start+=m.str().length()+m.position();

} while( r );

return 0 ;

}

g++ test_regex2.cpp
./a.out

input html : <a class="i-e" href="DATA IM INTERESTED IN">

<a class="chrome" href="nono chrome">

<a class="i-e" href="ie like1">

<a class="chrome" href="nono chrome">

<a class="i-e" href="ie like2">

<a class="chrome" href="nono chrome">

<a class="chrome" href="nono chrome">

<a class="i-e" style="font-size:10pt;" href="ie like3">

<a class="chrome" href="nono chrome">

<a class="chrome" href="nono chrome">

<a class="i-e" href="ie like4"> <a class="i-e" href="ie like5">


match :  href="DATA IM INTERESTED IN"

 URL : DATA IM INTERESTED IN

match :  href="ie like1"

 URL : ie like1

match :  href="ie like2"

 URL : ie like2

match :  style="font-size:10pt;" href="ie like3"

 URL : ie like3

match :  href="ie like4"

 URL : ie like4

match :  href="ie like5"

 URL : ie like5


'Develop > C&CPP' 카테고리의 다른 글

Vector 3  (0) 2018.05.23
Vector 2  (0) 2018.05.18
Vector 1  (0) 2018.05.16
gdb로 디버깅하기  (0) 2018.03.06
mutex 동기화 예제  (1) 2018.03.06
반응형

gdb 사용하기(디버깅)

C/CPP로 작성한 프로그램을 실시간 디버깅할 때 사용한다.
또는 에러 발생으로 core dump가 떨어지면 그 상태의 메모리 정보를 로딩하여 디버깅도 할 수 있다.

- gdb 실행
gdb [core]나 [실행 파일]
gdb a.out core
gdb a.out 1234 (attach to pid)
r [parameter]

- 파라미터
r [parameters]
l (file:function or line#) ; 소스


- break
break [function name]
break function1

- 다음 코드로 계속 진행
c ; continue

n ; next (step over)
s ; step (step into)

- bt ; back trace
call 스택 보기. 어느 함수에서 죽었는지 확인 가능. 디버깅 정보가 포함되어 있으면 코드 라인까지 나온다.

-q ; quit




1. 먼저 컴파일시 -g 옵션을 주어, 디버그 정보가 남도록 한다.

gdb [program]

2. 소스보기
l (list)  ; 파일:함수명, 함수명, 라인번호

set listsize 20 (20줄씩 나오게한다.)
l main
l 25
l file.c:func:

3. 실행
r (run) [arg1] [arg2] ...
k (kill) ; 프로그램 종료
s (step) ; trace into.
n (next) ; next line. (function skip...)
c (continue)
u (until) ; 현재 루프를 빠져나감
finish ; 현재 함수를 수행하고 빠져나감
return ; 현재 함수를 수행하지 않고 빠져나감.
return (x) ; 리턴함.


4. BP (break point)
b 19
b main
b file.c:10
b -2
b 10 if tmp==0  ; tmp가 0일때 10라인에 bp 설정

cl hello   ; BP 삭제
cl 10
cl file.c:20
d  ; BP 모두 해제

info breakpoints ; BP 목록
줄여서 i b  (TAB키 사용 가능)
enable 2
disable 2

5. w (watch)
watch i ; i값이 변경될때마다 알려줌. bp

info locals ; 지역변수 보기
info variables ; 전역 변수 리스트
p (printf) ; 개별 변수 보기

p *p ; 포인터 값 보기
p $eax ; 레지스터 값

display i ; 변수값을 항상 display
undisplay i;

6. 스택
bt (backtrace) ; 스택 출력
info f (frame)
info args
info locals

bt
frame 3
up ; 상위 스택 프레임으로 이동
down ; 하위 스택 프로임으로 이동



+ 쓰레드 정보
info threads

-디버깅 쓰레드 전환
t 쓰레드인덱스번호







'Develop > C&CPP' 카테고리의 다른 글

Vector 3  (0) 2018.05.23
Vector 2  (0) 2018.05.18
Vector 1  (0) 2018.05.16
정규식으로 스트링 일부 추출하기  (0) 2018.03.10
mutex 동기화 예제  (1) 2018.03.06
반응형


아래는 std::mutex를 이용한 C++ 동기화 예제 코드이다.

C 방식으로 동기화하는 것은 아래쪽에 pthread_mutex 예제를 참고하세요.


C++11 기준.

+std::mutex

#include <mutex>
#include <thread>
std::mutex mtx ;

void ThreadFunc(int nID, int &nVal) {
mtx.lock() ;
동기화 블록
mtx.unlock() ;
}

int main() {
int nVal=0 ;
std::thread th1(ThreadFunc, 0, std::ref(nVal)) ;
std::thread th2(ThreadFunc, 1, std::ref(nVal)) ;
th1.join() ;
th2.join() ;
return 0 ;
}




+ linux C mutex

#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_COND_INITIALIZER ;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER ;

int pthread_mutex_lock(pthread_mutex_t *mutex) ;
     다른 thread에서 mutex_lock을 해제할 때 까지 블록된다.
int pthread_mutex_unlock(pthread_mutex_t *mutex) ;
     mutex lock을 돌려준다.

int pthread_cond_signal(pthread_cond_t *cond) ;
     조건변수cond로 시그널을 보낸다. cond에서 wait하고 있는 쓰레드를 깨움.
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) ;
     조건변수 cond 시그널을 기다림. 블록.


ex)


void ThreadA(void *arg) {
pthread_mutex_lock(&mutexa) ;
to do
pthread_mutex_unlock(&mutexa) ;
}

pthread_t threada ;
int thra ;
int status ;
thra = pthread_create( &threada, NULL, ThreadA, (void*)NULL) ;
pthread_join(threada, (void**) &status) ;

gcc .. -lpthread




'Develop > C&CPP' 카테고리의 다른 글

Vector 3  (0) 2018.05.23
Vector 2  (0) 2018.05.18
Vector 1  (0) 2018.05.16
정규식으로 스트링 일부 추출하기  (0) 2018.03.10
gdb로 디버깅하기  (0) 2018.03.06

+ Recent posts