vector v; int i = 0; cout
C++을 사용하다 보면 중간 값을 구하는 연산으로 흔히들 아래와 같이 쓴다 mid = (l + r ) / 2; mid = (left + right) / 2; // 또는 mid = (start + end) / 2;가끔 다른 사람들이 짜 놓은 소스코드를 보면 아래와 같이 돼있는 걸 본적이 있다. mid = l + (r - l) / 2; mid = left + (right - left) / 2; mid = start + (end - start) / 2;수학적으로는 전혀 차이가 없는데 저렇게 나누는 이유는? Overflow 때문이다. 변수들이 int로 선언된 경우, left + right가 INT_MAX를 넘어서는 경우 overflow가 일어나서 원하는 결과대로 수행이 되질 않는다. 따라서 최소한의 방어벽을 치..
배열과 포인터가 동치라는 것은 이미 알고 있다. 예를 들어서 a[3]은 *(a+3) 이 되는 것이다. 하지만 다른 점은 배열은 포인터 상수로 선언 된다는 점이다. 즉 * const 이다. 따라서 int a[3]; int b[3]; 이 있을 때, a는 a[3]배열의 시작 주소를 나타내고 b 역시 b[3]배열의 시작 주소를 나타내지만 a = b; 는 할 수 없다. 왜냐면 const이기 때문에!! 해주고 싶다면 int a[3], int *b; 를 하고 b = a; 한다면 이것은 가능하겠다!! 자 이제... 2차원 배열의 포인터는 어떻게 선언할까? 그냥 대충 생각하면 꼭 int a[3][4]; int **p = a; 가 될 것 같이 생겼지만.. 되지 않는다. 왜일까? int a[3][4];로 선언한 이차원 배열..
int go( int search, int a, int b, int state, int turning ) { if( found == 1 ) return 1; if( turning > 3 ) //맨처음 시작을 생각해서 3임 { return 0; } if( map[a][b] == search && state != START ) { sx = a; sy = b; found = 1; return 1; } v[a][b] = 1; //U if( v[a-1][b] == 0 && ( map[a-1][b] == 0xFF || map[a-1][b] == search ) && a > 0 ) { if( state == U ) go( search, a-1, b, U, turning ); else go( search, a-1, b..
우선.. C++에서 CTest라는 클래스가 있을 경우 해당 객체에 대한 선언은 다음과 같이 할 수 있다. CTest test1, test2; 이 경우에 const를 붙여 쓰는 사람은 아마 거의 없을 것이다 -.-;; 그럴거면 왜 만들었어.. 만약 저 앞에 const CTest test1, test2; 이런식으로 const를 붙였다면 더이상 해당 객체는 변경을 할 수 없게 된다. 자 그럼 const가 사용되는 다양한 예를 쭉 적어보자 const CTest* pTest = new CTest; //이건 CTest const *pTest = new CTest; 와 같다 CTest* const pTest = new CTest; const CTest* const pTest = new CTest; int CTest:..
이중 포인터를 사용하는건 주로 포인터의 동적 배열을 나타내기 위해서 이다. 우선 아래와 같은 클래스가 하나 있다고 가정 해보자. class CTest { public: CTest() {} int a; }; 이녀석에 대한 포인터를 선언하고 객체 하나를 생성하려면 어떻게 해야할까? 다음과 같이 써주면 된다. CTest *pTest = new CTest; 이렇게 하면 pTest는 CTest의 객체를 참조한다. 근데 이제 CTest객체가 여러개 필요한 상황이 나오면 어떻게 해야할까 처음에 아무 생각없이 아래와 같이 했었다. CTest *pTest1 = new CTest; CTest *pTest2 = new CTest; ... 필요한게 정해져있다면 뭐 저래도 괜찮겠지만.. 그래도 매직넘버를 늘리는건 좋지 않다....
파라미터 없는 void function의 경우 그냥 소스가 길어지는게 싫어서 다른 곳으로 구분해 놓을려고 쓰게 된다. 뭐 그런 경우는 괜찮다 쳐도, 어느 기능을 담당하고 있는 녀석이 그런 식으로 분류 돼있다면 참으로 슬프다. 지금 딱 그것을 느끼게 되는 상황과 맞닿게 되었는데 그 내용은 다음과 같다. 로딩한 트랙킹 데이터(시간 순서로 순차적으로 놓여져 있음)를 재생함에 있어 타임라인이 필요하여 타임라인을 구현 하였다. 그리고 타임라인의 특정 영역을 찍으면 해당 지점으로 재생 장소가 이동되게 하였다. 근데 후에 다른 조건이 들어 왔는데 '트랙킹 데이터를 맨처음 open할 때, 재생할 구간을 선택 할 수 있게 해주세요' 였다. 현재 makeTimeline() {} 으로 해놓고 타임라인의 첫 부분은 0으로, ..
클래스를 주고 받을땐 레퍼런스를 사용하자!! 클래스 전체를 call by value로 넘긴다면 그 메모리는 어머어머하지만 레퍼런스로 넘기게 되면 겨우 포인터 변수의 크기 만큼만 넘기고 끝이다. 예를 들어서 AddPoint(POINT point); 라는 Method가 있다면 AddPoint(const POINT &point); 가 나을 것이다. (const는 적절히 써주자) 물론 호출한 놈의 인스턴스가 사라지지 않는 것이 확실히 될 때 얘기다.
- Total
- Today
- Yesterday
- AWS
- kering
- API
- 음악
- linux
- it
- database
- 프로그래밍
- C
- Quiz
- jni강좌
- gcc
- algorithm
- driver
- 드라이버
- 리눅스
- Cloud
- MFC
- java
- source
- 안드로이드
- winapi
- Python
- Troubleshooting
- Visual C++
- C++
- NDK
- db
- jni
- android
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |