'C/C++'에 해당되는 글 3건

비트 필드 스트럭쳐

혹시 소켓통신이나 시리얼 통신을 할때
최적화된 메모리관리가 필요할때 유용할꺼 같습니다.
예를들어..

    BYTE sendBuf[9];
    sendBuf[0]=0x01;
    sendBuf[1]=0x31;
    sendBuf[2]=0x01;
    sendBuf[3]=0x01;
    sendBuf[4]=0x31;
    sendBuf[5]=0x01;
    sendBuf[6]=0x01;
    sendBuf[7]=0x11;
    sendBuf[8]=0x01;
위와 같이 바이트 배열에다 필요한 HEX값을 넣으면
사이즈는 9바이트겠지여...무조건..
그러나 위와 같은 데이터를 그대로 저장하면서 훨씬 적은 메모리를 차지하는 방법이
비트필드스트럭쳐를 이용하면 될꺼같은 생각에..
struct test{            // Bit Field Structure
    BYTE a:2;
    BYTE b:6;
    BYTE c:3;
    BYTE d:2;
    BYTE e:6;
    BYTE f:3;
    BYTE g:2;
    BYTE h:6;
    BYTE i:2;
};
와 같이 비트별로 지정을 해준다음에
                test t;
    t.a    =0x02;
    t.b                 =0x33;
    t.c    =0x04;
    t.d    =0x02;
    t.e    =0x32;
    t.f    =0x05;
    t.g    =0x01;
    t.h    =0x32;
    t.i    =0x02
이렇게 넣어준다면
5바이트만 사용해서 최소량의 메모리를 써서 똑같은 작업을 할수 있을 듯합니다.
딱 필요한 비트크기만 알면 거기에 맞게 비트필드를 써서 남는 공간을 최대한 절약하는 거져.

서버-클라이언트에서 어떤 프로토콜을 이용해서 소켓통신을 할경우에 유용하지 않을까 해서 두서없는 글 올립니다.
혹시 잘못된점이나 저의 생각에 오점이 있다면 꼭 알려주시기 바랍니다.
그럼 즐거운 하루되시길.

2002-9-9일 작성
likehood

'개발' 카테고리의 다른 글

do not appear this message  (0) 2007.06.25
gSOAP 사용법  (1) 2007.06.21
비트 필드 스트럭쳐  (0) 2007.05.22
도대체 가상함수는 어디에다 쓰는 것일까.  (0) 2007.05.22
simpleAdo 2.0  (0) 2007.05.22
c/c++ 간단 토글링  (0) 2007.05.22

Trackbacks 0 / Comments 0

Leave Comments

simpleAdo 2.0


/*!
 \brief
  ADO Component Wrapper Class
  - Create Date/Ver : 2003.03.19 /1.0
   - RecordSet은 CreateInstance사용안함.
  - Modify Date/Ver : 2003.04.18 / 1.5
   - RecordSet셋팅을 위해  CreateInstance를 사용했습니다.(ExcuteQryEx)
   - SaveQryData함수 추가 : select로 불러온 데이터를 파일로 저장(XML)
   - ExcuteQryEx함수 추가(레코드셋 설정을 위해...)
  - Modify Date/Ver : 2003.05.19 / 1.6
   - ExcuteQry, InsUpDel()함수 가변인수 적용..
    - EX) \n
     int nData=10;\n
     ExcuteQry("select * from tab where id= %d",nData);\n
  - Modify Date/Ver : 2003.08.26 / 1.7
   - GetState()함수 추가...
    - Object의 상태를 리턴합니다.
  - Modify Date/Ver : 2004.04.02 / 1.71
   - GetData(int&) 부분 수정
    - MS-SQL decimal타입 리턴시 32000이상시 - 값으로 리턴되는 버그 수정
  - Modify Date/Ver : 2004.04.07 / 1.80
   - simpleAdo 인스턴스간 복사 지원
    - ex) simpleAdo ado1;\n
     ...\n
     ...\n
     ...\n
     simpleAdo ado2(ado1); //가능\n
     simpleAd0 ado3=ado1; //가능\n
     simpleAdo ado4;\n
     ado4=ado1;    //가능\n
   - 데이터베이스 처리시 에러시 dumpfile 지원
    - 데이터 베이스 작업시 에러 file로 저장.
  - Modify Date/Ver : 1.81
  - 타입 강화.
   - select 질의 후 _varient_t형태로 리턴 추가
  - Modify Date/Ver : 2005-11-15/ 1.82
   - 리턴타입 강화
   - CHAR값 리턴 함수추가
    - BOOL GetData(const long nCol,const long nRow,TCHAR& chData) const;
  - Modify Date/Ver : 1.90
   - ExcuteQry로 select Insert Update Delete Stored Procedure 모두 지원(기존함수로도 지원함.)
   - Stored Procedure실행시 Recordset이 존재할 경우 GetData()로 사용 가능.
  - Modify Date/Ver : 20060919/ 2.0
   - 시간이 많이 걸리는 쿼리 시 message pumping을 실시하여 UI가 멈추는 일이 없도록 함.
   - 사용자가 선택할수 있도록 SetMessagePump(BOOL)지원.
   - 참고사항
   - 프로젝트시작 / 종료부부분에 명기 -> ::CoInitialize(NULL); and ::CoUninitialize();
   - _ConnectionPtr,과 _RecordsetPtr의 사용 종료시 ->Close(), .Release()함수는 자동호출되므로 사용안함.
   - StoredProcedure 사용법
    - Return 값을 가지는 프로시져인 경우
     _CommandPtr 객체를 이용(MSDN 참조)\n
     In, Out Parameter를 생성하고 작업해야 함.\n
     _CommandPtr cmd;\n
     cmd.CreateInstance(__uuidof(Command));\n
     cmd->ActiveConnection=m_pConnection;\n
     cmd->CommandType=adCmdStoredProc;\n
     ...\n
     ...\n
     ...\n
    - Recordset을 리턴하는 경우
     ado.ExcuteQry("exec ProcName %d,%d,%d",1,2,3);\n
     ado.GetData(i,j,retData);\n
    - Return정보가 없는 경우
     ado.InsUpDel("exec ProcName 1,2,3"); \n
     또는 ado.ExcuteQry("exec ProcName 1,2,3");\n

 \author [likehood / 송영배]
 \date [2006-07-14 오후 3:35:59]
 \version [2.0]
 \bug
 \warning 대용량 데이터 쿼리시 HEAP메모리를 많이 차지하게 됩니다.
*/

'개발' 카테고리의 다른 글

비트 필드 스트럭쳐  (0) 2007.05.22
도대체 가상함수는 어디에다 쓰는 것일까.  (0) 2007.05.22
simpleAdo 2.0  (0) 2007.05.22
c/c++ 간단 토글링  (0) 2007.05.22
XmlLite SDK 관련..  (0) 2007.04.12
도서물 도착!!  (0) 2007.04.09

Trackbacks 0 / Comments 0

Leave Comments

c/c++ 간단 토글링

 (1) 0과 1을 토글(Toggle)하는 경우: 프로그램에서 변수의 값을 0↔1을 토글
    int i=0; //전역 or member 변수
    i^=1;//비트 배타합(eXclusive Or) 연산의 특징을 이용한다.
  이와 같은 기교는 임의의 두 수를 토글하는데 사용할 수 있다. 예를 들어 1
과 3을 토글하려면, 0001 ^ 0011 → 0010
이므로, 두 수의 배타합의 결과인 2와 배타합 연산을 하면된다.
    int i=1; //전역 or member 변수
    i^=2;//1과 3을 토글한다.
  (2) 1과 -1을 토글하는 경우
    int i=1; //전역 or member 변수
    i=-i;
  (3) 0,1,2,3을 토글하는 경우: 2개 보다 많은 숫자를 토글
    int j=0; //전역 or member 변수
    i=(i+1)%4;
  만약, 5,6,7,8을 토글하고 싶다면,
    int j=0; //전역 or member 변수
    int i;
    j=(j+1)%4;
    i=j+5;
처럼 사용한다. 일반적으로 m에서 시작하고 연속된 n개의 숫자를 토글하려면,
    int j=0; //전역 or member 변수
    int i;
    j=(j+1)%n;
    i=j+m;
을 사용하면 된다.
    (4) 임의숫자 토글 (참조표이용..)
    int toggle[]={100,34,200,79}; //전역 or member 변수
    int j=0, i;
    j=(j+1)%4;
    i=toggle[j];

'개발' 카테고리의 다른 글

도대체 가상함수는 어디에다 쓰는 것일까.  (0) 2007.05.22
simpleAdo 2.0  (0) 2007.05.22
c/c++ 간단 토글링  (0) 2007.05.22
XmlLite SDK 관련..  (0) 2007.04.12
도서물 도착!!  (0) 2007.04.09
H.264 white paper(intel)  (0) 2007.04.02

Trackbacks 0 / Comments 0

Leave Comments