달력

122024  이전 다음

  • 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

http://simple21.egloos.com/2559467

#include <memory.h> or <string.h>
void *memcpy(void *dest, const void *src, size_t count);

memory를 copy하는 함수로써, 매우 자주 사용한다.
대부분은 잘 알고 있겠지만, 아래의 세 가지 예를 살펴보도록 하자.
- 동일한 데이터 형에 대한 사용한 예
- 동일하지 않는 데이터 형에 대한 사용한 예
- Bit Field에 사용한 예

1.동일한 데이터 형에 대한 사용한 예
100개의 배열변수 a2의 값을 a1에 assign하려면, 가장 쉬운 방법은
double a1[100], a2[100];
for(int i=0; i<100; i++) a1[i] = a2[i];

이를 memcpy를 이용하면, 간단하고, 처리속도도 매우 빠르다.
memcpy(a1, a2, sizeof(double)*100);

대부분 이러한 목적으로 많이 사용한다. 하지만 메모리의 일부만을 copy하는 경우에도 많이 사용된다. 예를 들어, src_width, src_height의 src_data에서 일부영역 des_x, des_y, des_width, des_height의 데이터를 des_data에 넣고자 한다면,(이때 data는 unsigned char, 1차원 배열, gray-raw data라고 가정하면)

src_index = des_y*src_width+des_x;
des_index = 0;
for(int y=0; y<des_height; y++) {
    memcpy(des_data+des_index, src_data+src_index,
        sizeof(unsigned char)*des_width);
    des_index += des_width;
    src_index += src_width;
}
하면 된다. 위, 예제소스는 간단하다. 특별히 설명할 것도 없다. 하지만, 정확하게 어떻게 동작하는지 정도는 반드시 알고 있어야 한다. 메모리 전체 또는 일부에 대한 처리방법은 src와 des 각각의 처리할 시작주소와 count만 올바르게 넘겨주면 된다. 일부의 영역을 처리하는데 잘 이용을 해보기를 바란다.

2.동일하지 않는 데이터 형에 대한 사용한 예
통신 프로그램의 경우 다양한 데이터형의 자료를 전송하거나, 받는다. 이때 일반적으로 unsigned char형의 데이터에 담아서 주고받는다. 이러한 경우 unsigned char형의 데이터에 다양한 데이터형의 자료를 담아서 전송하거나, 받는 부분을 처리하게 된다.
만일
char c[10];
int a;
double f[5];
를 전송한다고 하면,

//send...
int item_size = 0, m_index=0;
unsigned char* data = new unsigned char[sizeof(char)*10+
    sizeof(int)+sizeof(double)*5)];
item_size = sizeof(char)*10;
memcpy(data, c, item_size);
m_index += item_size;
item_size = sizeof(int);
memcpy(data+m_index, &a, item_size);
m_index += item_size;
item_size = sizeof(double)*5;
memcpy(data+m_index, f, item_size);

//receive
int item_size = 0, m_index=0;
item_size = sizeof(char)*10;
memcpy(c, data, item_size);
m_index += item_size;
item_size = sizeof(int);
memcpy(&a, data+m_index, item_size);
m_index += item_size;
item_size = sizeof(double)*5;
memcpy(f, data+m_index, item_size);

이를 더욱 간단하게 처리를 한다면,
#pragma pack(1)
struct {
   char c[10];
   int a;
   double f[5];
} _packet;
#pragma pack()

unsigend char* data = new unsigned char[sizeof(_packet)];
memcpy(data, &_packet, sizeof(_packet));
으로 하면 되고, 이때 주고받는 쪽의 struct member alignment를 잘 고려해야한다.

이번시간에는 다양한 데이터 형을 한 가지 데이터 형에 어떻게 넣고 빼는지를 살펴보는 것이 매우 중요하다.

'C' 카테고리의 다른 글

gcc 컴파일 옵션  (0) 2008.07.16
make  (0) 2008.06.04
[함수] sprintf - 출력  (0) 2008.05.16
[함수] scanf - 문자입력받기  (0) 2008.05.15
[함수] printf - 표준출력  (0) 2008.05.15
Posted by 알 수 없는 사용자
|