'Open Source/C & C++'에 해당되는 글 8건

  1. 2011.05.04 사용되는 함수 인수변경에 따른 매크로 사용으로 파급 효과 최소화 하기
  2. 2011.04.13 구조체 포인터를 이용한 RcvData 옷입히기!!
  3. 2011.04.13 수치 Data 순서 리버스!! (Data 꼬아주기)

사용되는 함수 인수변경에 따른 매크로 사용으로 파급 효과 최소화 하기

|
기존 함수 LogMsg(char *Task, char *Msg) 형의 모듈을

LogMsg(char *Task, chark *Msg, char *Path)형으로 변경시

LogMsg함수를 사용하는 모듈 전체를 찾아서 해당 인수를 2개에서 3개로 변환 해야 하는 작업을 해 줘야 된다

이럴 경우 LogMsg를 사용하는 모듈들이 많을 경우 일일이 찾아서 해당 내용을 전부 변경해 줘야 하는 번거로움이 있다

이럴 경우 메크로를 이용하여 해당 내용을 최소하 하면 간단하게 해결 될 수 있다

기존 사용하던 LogMsg 함수명을 다른 함수 명으로 변경을 해준다

LogMsg -> Com_LogMsg
그리고 기존 인수를 3개로 추가 한다 그러면 최종

Com_LogMsg(char *Task, chark *Msg, char *Path)

형을 갖는 새로운 함수를 정의한다 물론 내용도 조금 변경이 될 것이다.

그리고 메크로 함수를 기존이름과 같은 형태로 지정 한다

#defile LogMsg(A, B) Com_LogMsg(A, B, "지정Path")

이런식으로 만들어 지면 모듈수정시 변경해야 되는 파급효과를 최소한으로 줄일 수가 있다!!

And

구조체 포인터를 이용한 RcvData 옷입히기!!

|
Data에 구조가 정형화 되어 있을 경우 해당 Data 구조체를 정의하고 문자열에 해당 구조체형태의 옷을 입히면 사용하기가 편리하다!

struct _STATDATA{
    char    item1[4];
    char    item2[10];
    char    item3[4];
    char    item4[5];
    char    item5[2];
};

int RcvModule(char *RcvData){
    struct _STATDATA *StatData;
    StatData = (struct _STATDATA *)RcvData
    StatData->item1;
    StatData->item2;
    StatData->item3;
    StatData->item4;
    StatData->item5;
}


포인터를 이용해 해당 구조체 Type으로 옷을 입힌다음 구조체 포인터 연산자를 이용하여 사용하면 된다!!
And

수치 Data 순서 리버스!! (Data 꼬아주기)

|
Unix System에서 Window System으로 소켓 통신을 할 경우 Data의 형태가 맞지 않아 원하는 Data가 나오지 않는 경우가 있다. String 값을 경우 제대로 나오지만 수치형 Data일 경우 System Format이 맞지 않아 Data의 형식이 좌, 우가 뒤바뀐 경우 이다. 이럴때 Socket Send전에 Data를 좌 우 배열을 바꿔 전송하면 제대로 나오는 경우가 있다! 이렬 때를 위한 Module을 간단하게 제작 해 보았다.

#define EConByte(A) ConByte((char *)&A, sizeof(A))
#define EConByteA(A) ConByteA((char *)&A, sizeof(A) / sizeof(A[0]), sizeof(A[0]))

void ConByte(char *OrginData, int TypeSize)
{
    char    TempData;

    typedef union
    {
        char Data[8];
    }Byte;

    Byte *ByteData;
    ByteData = (Byte *)OrginData;

    int ChangeLoop = 0;
    ChangeLoop = (TypeSize / 2);
    if (ChangeLoop == 0)
    {
        ChangeLoop = 1;
    }
    for (int i = 0; i < ChangeLoop ; i++ )
    {
        TempData = ByteData->Data[i];
        ByteData->Data[i] = ByteData->Data[(TypeSize-i) - 1];
        ByteData->Data[(TypeSize-i) - 1] = TempData;
    }
}

void ConByteA(char *OrginData, int ArrayLen, int TypeSize)
{
    typedef union
    {
        char Data[8];
    }Byte;

    char    TempData;

    for (int i = 0; i < ArrayLen ; i++)
    {
        Byte *ByteData;

        ByteData = (Byte *)(OrginData + (TypeSize * i));

        int ChangeLoop = 0;

        ChangeLoop = (TypeSize / 2);
        if (ChangeLoop == 0)
        {
            ChangeLoop = 1;
        }

        for (int j = 0; j < ChangeLoop ; j++ )
        {
            TempData = ByteData->Data[j];
            ByteData->Data[j] = ByteData->Data[(TypeSize-j) - 1];
            ByteData->Data[(TypeSize-j) - 1] = TempData;
        }
    }
}


Conbyte함수는 수치형 Data를 변경 할때 사용하고
ConbyteA함수는 수치형 Data배열 전체를 변경할 때 사용하고자 만들었다.

사용 편의를 위해 define을 이용하여 EConByte와 EConByteA를 정의 하여 같은 형태의 사용 할 수 있도록 정의 하였다.

실제 사용은 EConByte(변수) 또는 EConByteA(변수) 형태로 사용하면 된다!!
And
prev | 1 | 2 | 3 | next