Java를 좋아하긴 하지만 C++은 무시할 수 없지.
 
신고

Leave a Comment


힙 메모리를 침범해서 나는 것이었는데 메모리를 해제할 때 자꾸 발생했다.

문제점을 찾다보니 선언부에 문제가 있었다.

char*를 malloc 할 때 실제 사용하는 부분에다가 공백문자를 +1을 해주어야 하는데 깜빡했다가 나는 문제였다.
신고

Leave a Comment

마우스 휠 스크롤에 관한 처리 : WM_MOUSEWHEEL

마우스 휠 클릭 : WM_MBUTTONCLICK
다른 글에서 MBUTTON은 휠하고는 별개라는 글을 보았고 나도 그렇게 알고 있었는데 2008에서 처리를 하다보니 잘 처리되어진다.

신고

Leave a Comment


/*
 * Author  : Chang-Hwan Han
 * Date   : 2010.
 * Description : double linked list
 */
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

typedef struct node
{
  char* szName;
  struct node* prevNode;
  struct node* nextNode;
}Node;

Node* __insertNode(Node *pNode);
Node* __deleteNode(Node *pNode);
void __printNode(Node *pNode);
void __freeNode(Node *pNode);
void __freeNodeAll(Node *pNode);

void main()
{
  Node *head = NULL;
  char chInput;

  while(1)
  {
    printf("1. insert\n");
    printf("2. delete\n");
    printf("3. print all\n");
    printf("4. Exit\n");
    printf("input menu : ");
    scanf("%c", &chInput);
    if(chInput=='1')  head = __insertNode(head);
    else if(chInput=='2') head = __deleteNode(head);
    else if(chInput=='3') __printNode(head);
    else if(chInput=='4') break;
    else printf("input error\n");
    fflush(stdin);
  }
  __freeNodeAll(head);
}

Node* __insertNode(Node *pNode)
{
  Node *newNode, *curNode;
  char szInputName[50];
 
  printf("input node name : ");
  fflush(stdin);
  gets(szInputName);
  newNode = (Node*)malloc(sizeof(Node));
  newNode->szName = (char*)malloc((strlen(szInputName)+1) * sizeof(char));
  strcpy(newNode->szName, szInputName);
  newNode->nextNode = NULL;
  newNode->prevNode = NULL;

  if(pNode == NULL)
  {
    pNode = newNode;
    pNode->nextNode = NULL;
    pNode->prevNode = NULL;
  }
  else
  {
    curNode = pNode;
    while(curNode->nextNode != NULL)
      curNode = curNode->nextNode;
    curNode->nextNode = newNode;
    curNode->nextNode->prevNode = curNode;
 }
 return pNode;
}

Node* __deleteNode(Node *pNode)
{
  Node *curNode;
  char szInputName[50];
 
  printf("delete node name : ");
  fflush(stdin);
  gets(szInputName);
 
  curNode = pNode;
  while(curNode != NULL)
  {
    if(strcmp(curNode->szName, szInputName) == 0)
    {
      if(curNode->prevNode == NULL && curNode->nextNode == NULL)
      {
        pNode = NULL;
      }
      else if(curNode->prevNode == NULL)
      {
        pNode = pNode->nextNode;
        curNode->nextNode->prevNode = NULL;
      }
      else if(curNode->nextNode == NULL)
      {
        curNode->prevNode->nextNode = NULL;
      }
      else
      {
        curNode->nextNode->prevNode = curNode->prevNode;
        curNode->prevNode->nextNode = curNode->nextNode;   
      }
      __freeNode(curNode);
      break;
    }
    curNode = curNode->nextNode;
  }
  if(curNode == NULL) printf("node not found\n");
  return pNode;
}

void __printNode(Node *pNode)
{
  while(pNode != NULL)
  {
    printf("%s -> ", pNode->szName);
    pNode = pNode->nextNode;
  }
  printf("\n");
}

void __freeNode(Node *pNode)
{
  free(pNode->szName);
  free(pNode);
}

void __freeNodeAll(Node *pNode)
{
  Node *node;
  while(pNode != NULL)
  {
    node =pNode;
    pNode = pNode->nextNode;
    __freeNode(node);
  }
}


신고

Leave a Comment

/*
 * Author  : Chang-Hwan Han
 * Date   : 2010.10.26
 * Description : using a double pointer instead of an two-D array
 */
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

void __printVar_pointer(char **pszVar, int nMaxCount);
void __printVar_array(char (*pszVar)[20], int nMaxCount);

void main()
{
  int nCount = 3, i =0;
  char **szPointer = NULL; 
  char szArray[3][20] = {"pointer", "array", "stack and heap"};
 
  szPointer = (char **)malloc(sizeof(char*)*nCount);

  for(i=0; i<nCount; i++)
  {
    szPointer[i] = (char *)malloc(strlen(szArray[i]) + 1);
    strcpy(szPointer[i], szArray[i]);
  }

  __printVar_array(szArray, nCount);
  __printVar_pointer(szPointer, nCount);
 
  for(i=0; i<nCount;i++) free(szPointer[i]); 
  free(szPointer); 
}

void __printVar_pointer(char **pszVar, int nMaxCount)
{
  int i;
  printf("--------------------\n");
  printf("  Double Pointer\n");
  printf("--------------------\n");
  for(i=0; i<nMaxCount; i++)
  {
    printf("sizeof[%d] Var[%s] \n", strlen(pszVar[i]), *(pszVar+i));
  }
}

void __printVar_array(char (*pszVar)[20], int nMaxCount)
{
  int i;
  printf("--------------------\n");
  printf("  Two-D Pointer\n");
  printf("--------------------\n");
  for(i=0; i<nMaxCount; i++)
  {
     printf("sizeof[%d] Var[%s] \n", strlen(pszVar[i]), *(pszVar+i));
  }
}
/*
 *(a+0)  = a[0]
 *(*a+1) = a[1][0]
 */



이중 포인터에 동적으로 이차원 배열을 할당하기 위해 잠시 테스트를 해보았다.
문제는 이차원 배열을 이중포인터로 넘기지 못하는 것인데 이 부분은 조금 더 공부를 해봐야겠다.

참조글 :
[1] http://winapi.co.kr/clec/cpp1/11-3-5.htm
[2] http://kldp.org/node/51763
[3] http://blog.naver.com/junetaeda?Redirect=Log&logNo=30035439018


신고

Leave a Comment

구조체 패킹 및 패딩 비트에 대해서 잠깐 애기하려고 한다.
VC6에서 테스트를 해보았고, 2005버전 이하는 4바이트 패킹을 하고 2008부터는 8바이트 패킹을 한다고 들었는데 VC6에서 무조건 4바이트 패킹을 하지 않았다.


 struct var
 {
   char a;
 };

이 구조체의 크기는 얼마일까? 1Byte이다.


 struct var
 {
   char a[2];
   char b;
 };

이 구조체의 크기는 얼마일까? 3Byte이다.


 struct var
 {
   short a;
   char b;
 };

이 구조체의 크기는 얼마일까? 4Byte이다.


 struct var
 {
   int a;
   char b;
 };

이 구조체의 크기는 얼마일까? 8Byte이다.


 struct var
 {
   double a;
   char b;
 };

이 구조체의 크기는 얼마일까? 16Byte이다.

어째서 크기가 이렇게 돼는 것일까?
그것은 바이트 크기 단위를 끊는 패킹 크기가 제일 큰 변수형태에 의해서 바뀌기 때문이다.

char : 1Byte
short : 2Byte
int : 4Byte
double : 8Byte

구조체 안에 double이 있으면 double의 크기에 맞춰서 8Byte단위로 패킹을 했기 때문이다.
1Byte 패킹으로 지정해주지 않는 이상, 이렇게 패킹 크기에 따라서 구조체에 남는 공간이 생기게 되는데 이것을 패딩 비트라고 한다.
(패딩 비트 참조 : http://pangate.com/19)


패킹 크기를 지정해주지 않은 상태에서 구조체 안의 변수들의 순서를 무분별하게 하면 패딩 비트는 더욱 커진다.
아래 예를 참조하자.

 ex1) 좋은 예
struct var

 char a; 
 char b;
 int c; 
};

크기 : 8Byte
ex2) 나쁜 예
struct var

 char a; 
 int c;
 char b; 
};

크기 : 12Byte


ex1과 ex2는 int변수 때문에 4Byte패킹을 한다. 그런데 ex1에서는 char가 붙어있어서 a와 b가 2Byte를 차지하고 2Byte의 패딩비트가 발생하게 됀다.

그런데 ex2에서는 char가 1Byte를 차지한 상태에서 남는 공간은 3Byte인데 다음에 int가 오기 때문에 3Byte의 패딩비트를 발생시킨 후에 int를 할당하고 b를 선언함으로 3Byte의 추가 패딩비트를 발생시킨다. 그래서 총 6Byte의 패딩비트가 발생하게 됀다.

구조체에서 변수의 순서도 이렇게 중요한 것이다;;

만약 구조체 패킹을 1Byte단위로 끊고 싶다면 "pragma pack"을 이용해서 직접 지정해주면 됀다.


  #pragma pack(push, atin_data_definition, 1)
  struct var
  {
    ...
  };
  #pragma pack(pop, atin_data_definition)

또는


  #pragma pack(push)
  #pragma pack(1)
  struct var
  {
    ...
  };
  #pragma pack(pop)



 "pragma pack"을 이용한 패킹 예

 ex1) 1Byte 패킹
#pragma pack(push, atin_data_definition, 1)
struct var
{
 char a;
 int b;
 char c;
 int d;
};
#pragma pack(pop, atin_data_definition)

크기 : 10Byte
ex2) 4Byte 패킹
struct var
{
 char a;
 int b;
 char c;
 int d;
};



크기 : 16Byte


신고

Comments

  1. 차가운잎사귀 2011.04.27 09:17 신고 Permalink Modify/Delete Reply

    너무감사드립니다.. 구조체 sizeof연산자로 구하는데 값이 이상하게 나와서 검색해보니

    패딩비트라길래 또검색하니 이해가잘안됬는데 작성하신 블러그내용때문에 이해하게돼었습니다.

    너무너무감사드립니다..

    "그것은 바이트 크기 단위를 끊는 패킹 크기가 제일 큰 변수형태에 의해서 바뀌기 때문이다."
    "구조체 안에 double이 있으면 double의 크기에 맞춰서 8Byte단위로 패킹을 했기 때문이다."

    여기문장때문에 깨달음을 얻었습니다^^

Leave a Comment

VC 2008에서 컴파일을 하다가 갑자기 이상한 에러가 나타났다.

'symbol' 외부 기호(참조 위치: 'function' 함수)에서 확인하지 못했습니다.

갑자기 무슨 에러일까하고 찾아보았더니 이런 저런 이유가 나왔지만, 나하고 맞는 해결책이 없는듯했다.
그리고 내 해결책은 프로그램을 종료했다가 다시 켜서 컴파일 하는 것이였고 에러는 사라졌다.


* Reference
http://www.evilskel.com/178
http://msdn.microsoft.com/ko-kr/library/799kze2z(VS.80).aspx
신고

Leave a Comment

역시 VC++은 사람 짜증나게 하는데 일가견이 있다.
Win7에서 파일 검색이 자꾸 이상하게 되서 없는지 알고 한참을 삽질을 했다.

vcvars32.bat 및 nmake.exe파일은 Visual Studio가 설치될 때 같이 설치된다.

VisualStudio 6에서 vcvars32.bat, nmake.exe위치
C:\Program Files\Microsoft Visual Studio\VC98\Bin;

VisualStudio 2008에서 vcvars32.bat, nmake.exe위치
C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools;
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin;
신고

Leave a Comment


fatal error C1083: Cannot open include file:

라는 에러가 때때로 나곤 한다.
헤더 파일을 찾을 수 없을 때 나는 에러인데 보통 헤더 경로가 제대로 지정되지 않았거나 헤더 파일을 정말로 없을 때 난다.

그런데 Visaul Studio 6에서 이 include 경로를 추가해주는 것을 한참을 찾았다. 찾고 보니 내가 왜 못 찾았지라는 의문이 들었다;

프로젝트에 추가
[Project] -> [Settings..] -> [C/C++] -> Category : Preprocessor -> Additional include directories : 에 추가

자체 Visual Studio에 추가
[Tools] -> [Directories] -> Show directories for: Include files -> 아래쪽 Directories: 에 추가


신고

Leave a Comment

CString을 char로 변환하는 방법이다.

유니코드 프로젝트


  wchar_t szChar[16];
  CString strString;
  strString = "test";
  _tcscpy_s(szChar, 16, strString.GetBuffer() );



멀티바이트 프로젝트

  char szChar[16];
  CString strString;
  strString = "test";
  strcpy_s(szChar, 16, CW2A(strString) ); 



 

저작자 표시
신고

Leave a Comment


to Top