배열과 포인터가 동치라는 것은 이미 알고 있다. 예를 들어서 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; ... 필요한게 정해져있다면 뭐 저래도 괜찮겠지만.. 그래도 매직넘버를 늘리는건 좋지 않다....
View&Doc 구조에서 MDI 형식의 프로젝트를 만지면서 수 없이 많은 삽질 과정을 거쳤지만, 그 중에 가장 뼈저리게 기억에 남는 교훈은 같은 정보를 담는 인스턴스를 여러개 만들지 말자 라는 것이다. 즉, 하나만 생성해서 나머지는 포인터로 참조하도록 하자.(그렇다면 어디서 인스턴스를 생성하느냐도 존나 갈등때리고 고민때리는 문제가 된다.) 일단.. 현재 맡고 있는 프로젝트의 프로그램을 보면 Doc에서 관리하는 변수와 View에서 관리하는 변수가 있으며, 특이하게도 실제 화면이 그려지는 영역은 Actuator라는 녀석이다. 즉 View와 Actuator사이에서 옵져버 패턴으로 관리되고 있는 모양새다. 이제 Doc과 View사이의 변수가 커뮤니케이션 함에 있어, 허접 프로그래머인 나는 계속해서 같은 인스턴스..
1. 대화상자에 세로 스크롤바를 붙이자. 2. 스크롤 바에 컨트롤 변수를 추가한다. CScrollBar m_ctrVScroll; 3. 스크롤 바 초기화 // 스크롤 바 의 사용영역 설정. m_ctrVScroll.SetScrollRange(0, 100); // 스크롤 바의 위치 설정 m_ctrVScroll.SetScrollPos(50); // 스크롤바의 모든 정보를 한번에 설정하기 SCROLLINFO scrinfo; scrinfo.cbSize = sizeof(scrinfo); scrinfo.fMask = SIF_ALL; scrinfo.nMin = 0; // 최소값 scrinfo.nMax = 100; // 최대값 scrinfo.nPage = 10; // 페이지단위 증가값 scrinfo.nTrackPos = ..
슬라이더 컨트롤(Slider Control) 1. 대화상자에 슬라이더을 붙이자. 2. 슬라이더 컨트롤의 컨트롤 변수 추가 CSliderCtrl m_ctrSlider; 3. 슬라이더 컨트롤 설정 // 사용영역 값 설정한다. m_ctrSlider.SetRange(0, 100); // 최소 값 설정. m_ctrSlider.SetRangeMin(0); // 최대 값을 설정. m_ctrSlider.SetRangeMax(100); // 위치 설정. m_ctrSlider.SetPos(50); // 눈금 간격을 설정한다. // 속성의 Tick Marks와 Auto Ticks가 True로 되어 있어야 한다. m_ctrSlider.SetTicFreq(10); // 키보드 커서키로 슬라이더를 움직일때의 증가 크기를 설정 m..
특정 컨트롤이나 변수에 의존적으로 값을 갖는 변수가 있을 수 있다. 예를 들어 MFC의 slider 컨트롤에서 물체의 투명도를 제어 한다고 해보자. 그럼 투명도를 관리하는 컨트롤러 이름은 m_nSliderOpacity; 그리고 실제로 Object의 투명도가 제어 되는 부분은 pObject->SetOpacity(fValue); 라고 하면 m_nSliderOpacity의 POSITION과 pObject->setOpacity의 fValue는 매우 디펜던트하게 움직인다. 즉 하나만 바뀔 수는 없다는 것이다. 슬라이더는 내가 움직여 주는거잖아? 라고 생각 할 수도 있겠지만. 예를 들어 '탭 구성'으로 화면을 적용 하였을 때 다른 탭으로 갔다가 돌아오는 경우, 슬라이더를 기존에 사용한 값으로 변경해 주어야 하는 경..
- Total
- Today
- Yesterday
- android
- jni강좌
- C
- kering
- 안드로이드
- Troubleshooting
- linux
- AWS
- 드라이버
- 프로그래밍
- it
- Visual C++
- source
- API
- database
- MFC
- Python
- algorithm
- db
- jni
- 리눅스
- winapi
- java
- gcc
- driver
- Cloud
- 음악
- C++
- NDK
- Quiz
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |