'Program'에 해당되는 글 22건
- 2012.04.06 ChartFX X축과 Y축에 특정 값의 선을 추가하기.
- 2012.04.03 C# MDI 화면 같은창 띄우지 않게 하기
- 2012.04.03 Chart FX에서 멀티라인 표현시 Second Y 좌표 추가하기.
- 2012.03.30 기본 구조체 사이즈 변경. #pragma pack 사용
- 2012.03.29 C# : DataGridView에 폰트 지정하기.
- 2012.03.29 C# : font 설정 방법
- 2011.04.25 Char 를 CString에 넣기.
- 2011.04.25 CSting 을 Char 로 바꾸기.
- 2011.02.07 포인트 어드레스 지우면 Data설정시 디진다.
C, C++ 에서 구조체의 저장크기가 변하는 경우가 있다.
이는 기본 구조체의 싸이즈가 정해져 있기 때문이다.
윈도우에서는 프로그램 속성에서 기본구조체를 원하는 형태로 바꾸면 된다. 그러나 그럴경우 어떠한 문제가 생길지는 기존에 사용하는 프로그램과 호환시 문제가 발생할 수 있다.( 기존프로그램에서는 변경되지 않고 사용했을 경우 서로 주고받는 Data 의 구조가 달라져서 문제가 생긴다.)
이 때, 기본 구조체의 싸이즈는 그대로 두고 현재 부분의 구조체만 변경시에는 #pragma pack 을 사용한다.
struct __TEMP_DATA_S
{
short aaa;
int bbb;
}
위의 구조체를 sizeof 하여 값을 보면 8로 나온다.
우리가 생각할때는 6으로 나와야되나 기본 구조체 사이즈가 4바이트 형식이므로 맞추어 떨어지게 하기위하여 2바이트를 더하여 8바이트로 변경된다.
#pragma pack(puch, 2) // 기본구조체사이즈를 2바이트형으로 변경한다.
struct __TEMP_DATA_S
{
short aaa;
int bbb;
}
#pragma pack(pop) // 기본구조체 사이즈를 2바이트형에서 원래의 기본 바이트로 변경한다.
으로 #pragma pack 을 추가하면 sizeof 시 값이 우리가 원하는 6으로 나온다.
참고 ----1
#pragma pack(puch, 1) // 기본구조체사이즈를 1바이트형으로 변경한다.
struct __TEMP_DATA_S
{
short aaa;
char ccc;
int bbb;
}
#pragma pack(pop) // 기본구조체 사이즈를 1바이트형에서 원래의 기본 바이트로 변경한다.
----1
제 경험상으로는 PLC와 PC 와의 통신 프로그램 생성시 PC는 4바이트가 기본형이지만 PLC측은 WORD(2바이트)가 기본형이어서 문제가 많이 발생하여 그 때, 주로 사용하였습니다.
pack의 puch는 뒤의 사이즈로 변경한다는 의미.
pack의 pop은 바꾸기전의 사이즈로 변경한다는 의미.
* (VC,VC++) 와 (GCC, G++) 간에는 약간의 사용상 차이가 있을 수 있다.
이 부분은 다로 설명이 필요 없으나 아래에 반하는 것을 하나 적어놓느다.
CString tempCS;
tempCS.Format(“ADD”);
or
char tempChar[16];
memcpy(tempChar, “ADD”, 3);
tempCS.Format(“%.3s”, tempChar);
위와같이 두가지 방법으로 Data를 넣을 수 있다.
1. memcpy 사용하기가 가장 좋아하는 방법으로 단지 넣을 길이보다 받는 곳이 더 사이즈가 커야한다.
CString tempCS = “qwerty";
char tempChar[16];
memcpy(tempChar, &(LPCTSTR)tempCS ,tempCS.GetLength());
2. strcpy 사용하기는 함수 자체를 별로 좋아하지 않으므로 패스.
CString tempCS = “qwerty";
int length = tempCS .GetLength();
char* tempChar= new char[length];
strcpy(tempChar, tempCS.GetBuffer(0));
3. 형변환 사용하기가 있는데 이 방법은 비추 합니다.
CString tempCS = “qwerty";
char* tempChar= LPSTR(LPCTSTR(tempCS ));
4. sprintf 사용하기 또한 좋아하는 방법으로 DATA의 넣는 형식 또한 지정할 수 있어서 통신프로그램작성시 많이 사용한다. 단 받을 DATA의 최대 길이를 미리 알고 있어야 한다.
CString tempCS = “qwerty";
char tempChar[16];
sprintf(tempChar,”%.6s”,tempCS.GetString());
포인터로 선언된 것을 초기화시 &를 붙여서 초기화하면 Data의 초기화가 아니라 포인트 어드래스를 초기화하여 Data를 입력하지 못하게한다.(입력을 못하게 하는것이 아니라 시스템 메모리 어드래스를 침범하므로 강제 종료처리가 되는것임 )