블로그 이미지
평강왕자

카테고리

분류 전체보기 (35)
Programming Lv1 (32)
Programming LV2 (0)
취미 (3)
Total
Today
Yesterday

달력

« » 2025.1
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 31

공지사항

최근에 올라온 글


1차원 배열 동적 할당과 배열 크기를 알아야 하는경우가 있다.

//할당 new
int* array;
int = arraySize = 10;
array = new int[arraySize];

//할당 malloc
int* arry;
arry = (int*)malloc(sizeof(int)*10);

//배열의 크기
int size =  sizeof(array) / sizeof(array[0]);
Posted by 평강왕자
, |


간혹가다 프로토콜형태로 Char배열에 Byte형태로 전송하고 받아야 하는경우
long short 같은경우 비트 연산이 가능하지만 float 같은경우 비트연산이 불가능하다.

//샘플로 char배열과 float값 설정
char _charArray[4];
 float _floatValue = 12345.6789F;
//변환 전 값 체크
printf( " \n %10.5f " , _floatValue ) ;

//float 값을 unsigned log 으로 변환하여 한바이트씩 비트연산으로 배열에 집어 넣는다.
 _charArray[0] = (char)(*((unsigned long*)&_floatValue ) >> 24);
 _charArray[1] = (char)(*((unsigned long*)&_floatValue ) >> 16);
 _charArray[2] = (char)(*((unsigned long*)&_floatValue ) >> 8);
 _charArray[3] = (char)(*((unsigned long*)&_floatValue ));

//char배열에 집어넣은 값을 unsigned long 에 집어넣는다.
//여기서 & 0xFF를 제거할경우 부호 확장이 발생하여 값이 제대로 출력되지 않는다.
 unsigned long _longValue = (((unsigned long)_charArray[0]&0xFF) << 24);
  _longValue+= (((unsigned long)_charArray[1]&0xFF) << 16) ;
  _longValue+= (((unsigned long)_charArray[2]&0xFF) << 8) ;
  _longValue+= (((unsigned long)_charArray[3]&0xFF));;

//가져온값을 float로 변환한다.
 float fData = *((float*)&_longValue);
//변환후 값 출력
 printf( " \n %10.5f " , fData ) ;

이방법 말고 union을 사용하는 방법도 있다.

//union으로 float와 unsigned log 을 선언한다.
union {
  unsigned long l;
  float f;
 }u1,u2;

//u1구조체의 float에 값 삽입 ( unsigned log 에도 자동으로 값 삽입) 
u1.f = 1234.56789F;

//삽입된 값 출력
 printf( " \n %10.5f " , u1.f ) ;

//위에 예제와 다르게 부호확장을 위해서 unsigned char로 선언했다
//unsigned char일경우 부호가 없기 때문에 부호확장시 전부 0을 채워넣는다. 그래서 &0xFF가 필요 없다.
 unsigned char c[4];
 c[0] = u1.l >> 24;
 c[1] = u1.l >> 16;
 c[2] = u1.l >> 8;
 c[3] = u1.l;

 u2.l = c[0]<< 24;
 u2.l |= c[1]<< 16;
 u2.l |= c[2]<< 8;
 u2.l |= c[3];

  //u2.l = (c[0] & 0xFF) << 24;
 //u2.l |= (c[1] & 0xFF) << 16;
 //u2.l |= (c[2] & 0xFF) << 8;
 //u2.l |= (c[3] & 0xFF);

 printf( " \n %10.5f " , u2.f ) ;

Posted by 평강왕자
, |
MDI를 사용하면 다른 창에서 다른창을 호출해야 하는경우가 생긴다.
그경우 창을 구분해야 하는데.. 활성창을 가져오는건 함수가 있어서 간단하다.
메인프레임에서 차일드 객체를 가져와서 활성화되어있는 창을 부르면 포인터를 넘겨준다.

//메인프레임
CMainFrame *pFrame = (CMainFrame*)AfxGetMainWnd();
//차일드 프레임
CChildFrame *pChild = (CChildFrame*)pFrame->GetActiveFrame();
//활설화 View
CPerformanceMonitoringOneViewView *pView = (CPerformanceMonitoringOneViewView*)pChild->GetActiveView();

창이 여러개일경우 활성창이 아닌 다른창을 가져오는경우는 조금 다르다.
App 에서 Doc를 호출하여 현재 View의 목록을 가져와서 호출한다.

CWinApp* pApp = AfxGetApp();
POSITION posTemplate;
posTemplate = pApp->GetFirstDocTemplatePosition();
while(posTemplate)
{
 CDocTemplate* pDocTemplate;
 pDocTemplate = pApp->GetNextDocTemplate(posTemplate);
 POSITION posDoc = pDocTemplate->GetFirstDocPosition();
 while(posDoc)
 {
  CTestDoc* pDoc2 = (CTestDoc*)pDocTemplate->GetNextDoc(posDoc);
  POSITION posView = pDoc2->GetFirstViewPosition();
  while(posView)
  {
   CTestView* pView = (CTestView*)pDoc2->GetNextView(posView);
   pView->m_graphDlg->Test();
  }
 }
}
Posted by 평강왕자
, |

최근에 달린 댓글

글 보관함