'Programming/C / Win32 / MFC'에 해당되는 글 120건

  1. 2014.02.25 const / pointer
  2. 2013.12.18 assert()
  3. 2013.06.15 printf의 %s와 %S
  4. 2013.06.15 win32api - joystick 예제
  5. 2013.02.14 Windows IME
  6. 2013.01.06 == 와 = 의 실수를 피하기 위한 트릭 (2)
  7. 2012.07.02 c 변수범위 헤더
  8. 2012.06.14 엔디안 / endian (2)
  9. 2012.06.12 localtime의 return값을 조심하세요 (2)
  10. 2012.03.28 C언에 이스케이프 문자를 이용한 특수문자 출력하기
c++ 레퍼런스를 보다 보니
포인터에 const가 붙으면 어떻게 접근보호가 될지 궁금해 검색을 해보니 똭! ㅋㅋ

const 포인터
const void *p = &ori;
포인터의 주소 변경 불가(레퍼런스 화?) 내용 변경 가능

포인터 const
void const *p;
포인터 주소 내의 내용  변경 불가

const 포인터 const
const void const *p
포인터 주소 및 주소 내의 내용 변경 불가

[링크 : https://kldp.org/node/48414]
[링크 : http://quoobit.egloos.com/1379839]

+ 특이사항으로는..
const 변수를
포인터로는 조작이 가능하다는거.. 당연한걸지도 모르겠지만... ㄷㄷㄷ 

int main()
{
        const int a = 0;
        int *p;

        p = &a;

        printf("%d %d\n",a,*p);

        *p = 2;
//      a = 1;

        printf("%d %d\n",a,*p);

        return 0;
} 

$ ./a.out
0 0
2 2

어짜피 const는 컴파일 타임에 결정되는 것 이기에
메모리 상에 주소로 접근시에는 해당 메모리 영역이 read-only인지 알 수 없기에
포인터로 (const 포인터 const라면 안되겠지만) const 영역의 데이터를 조작이 가능하다는 놀라운(?) 사실 ㄷㄷ

---
2014.3.5 추가
gcc 에서는 문제없이 되지만 vs2008에서는 에러가 난다. 
1> error C2440: '=' : 'const int *'에서 'int *'(으)로 변환할 수 없습니다.
1>        변환하면서 한정자가 손실됩니다. 

또한 gcc에서 되던 문법이 경고가 발생한다.
const int const *p1;
1> warning C4114: 동일한 형식 한정자를 두 번 이상 사용했습니다.  



신고

'Programming > C / Win32 / MFC' 카테고리의 다른 글

2중 포인터 사용이유  (0) 2014.03.19
typeof  (0) 2014.03.11
const / pointer  (0) 2014.02.25
assert()  (0) 2013.12.18
printf의 %s와 %S  (0) 2013.06.15
win32api - joystick 예제  (0) 2013.06.15
Posted by 구차니

댓글을 달아 주세요

한번쯤은 써봐야지하는 것 중에 하나
가장 강력하고 원초적인 디버깅 중에 하나로 printf()가 있다면
꽤나 상큼하고 스마트한 방법이라는데

assert()에서 비교문이 false 일 경우 강제종료 + 덤프를 한다고 한다.
일단 C/C++ 다 지원하는 듯..

NDEBUG가 정의되면 assert() 가 수행되지도 컴파일 되지도 않는다고 한다.
 #define NDEBUG // disable assert() calls

#include <assert.h>
void assert(scalar expression);
[링크 : http://linux.die.net/man/3/assert

[링크 : http://forum.falinux.com/zbxe/index.php?document_srl=408376&mid=C_LIB]
[링크 : http://www.cplusplus.com/reference/cassert/assert/]


---
2013.12.19
//#include <assert.h>
로 주석처리 하고 assert()를 부르면 컴파일 부터 배짼다 -_-
$ gcc c.c
/tmp/ccpSwySM.o: In function `main':
c.c:(.text+0x11): undefined reference to `assert'
collect2: ld returned 1 exit status 

#include "stdio.h"
#include "assert.h"

int main()
{
        assert(0);

        return 0;
}

음.. 우분투 12.04 LTS desktop에서 코어 덤프를 안하도록 해놔서 그런가..
덤프 파일이 생성되진 않았다.
$ gcc c.c
/tmp/ccpSwySM.o: In function `main':
c.c:(.text+0x11): undefined reference to `assert'
collect2: ld returned 1 exit status 

신고

'Programming > C / Win32 / MFC' 카테고리의 다른 글

typeof  (0) 2014.03.11
const / pointer  (0) 2014.02.25
assert()  (0) 2013.12.18
printf의 %s와 %S  (0) 2013.06.15
win32api - joystick 예제  (0) 2013.06.15
Windows IME  (0) 2013.02.14
Posted by 구차니

댓글을 달아 주세요

유니코드 문자열 출력에 %S를 사용하면 매우 좋다
(웬지 리빙 포인트 기분인데?)

조이스틱 이름 받아오는데
JOYCAPS pjc;
pjc.szPname 에 조이스틱의 이름이 'M' 만 출력되서 혹시나 출력을 바꾸어 보니
"Microsoft PC-joystick driver"

윈7은 내부적으로도 문자열을 유니코드로 사용하나 -ㅁ-?

[링크 : http://www.jiniya.net/wp/archives/4299]
신고

'Programming > C / Win32 / MFC' 카테고리의 다른 글

const / pointer  (0) 2014.02.25
assert()  (0) 2013.12.18
printf의 %s와 %S  (0) 2013.06.15
win32api - joystick 예제  (0) 2013.06.15
Windows IME  (0) 2013.02.14
== 와 = 의 실수를 피하기 위한 트릭  (2) 2013.01.06
Posted by 구차니

댓글을 달아 주세요

어디다 넣어야 하는지 몰라서 대충.. 투척
일단 winmm.lib를 링크 해야 하고
winmm.dll을 해도 된다는데 dll은 쓸줄 모르니 패스 -ㅁ-


windows.h와 MMSystem.h를 포함하면된다.
사용한 함수들은 아래 예제 참고.

요즘 조이스틱은 4축 지원(X/Y/Z/R)를 많이 지원하므로
joyGetPos보다는 joyGetPosEx를 사용하는 것이 좋을듯 하다.
버튼은 1번 부터 1bit씩 LBS에서 MBS로 하나씩 올라간다(버튼이 12개 있으면 2^12 = 2048까지 올라가게 된다.

드라이버의 이름(제품명)은 Unicode로 저장되어 있으니 필요하면 %S로 출력하면 된다.

#include "stdafx.h"
#include "windows.h"
#include "MMSystem.h"

int _tmain(int argc, _TCHAR* argv[])
{

	JOYINFO joyinfo; 
	JOYINFOEX joyinfo2; 
	JOYCAPS pjc;
	UINT wNumDevs, wDeviceID; 
	BOOL bDev1Attached, bDev2Attached; 

	if((wNumDevs = joyGetNumDevs()) == 0) 
	{
		return MMSYSERR_NODRIVER;
	}

	joyGetDevCaps(JOYSTICKID1, &pjc, sizeof(JOYCAPS));

	printf("%d %d %S\n%d %d %d %d %d %d\n%d %d %d\n%d %d %d %d %d %d\n%d %d %d %d\n%S %S\n",
	pjc.wMid, 
	pjc.wPid, 
	pjc.szPname, 

	pjc.wXmin, 
	pjc.wXmax, 
	pjc.wYmin, 
	pjc.wYmax, 
	pjc.wZmin, 
	pjc.wZmax, 

	pjc.wNumButtons, 
	pjc.wPeriodMin, 
	pjc.wPeriodMax, 

	pjc.wRmin, 
	pjc.wRmax, 
	pjc.wUmin, 
	pjc.wUmax, 
	pjc.wVmin, 
	pjc.wVmax, 

	pjc.wCaps, 
	pjc.wMaxAxes, 
	pjc.wNumAxes, 
	pjc.wMaxButtons, 
	pjc.szRegKey, 
	pjc.szOEMVxD);

	printf("%d\n",wNumDevs);
#if 1
	for(;;)
	{
		bDev1Attached = joyGetPosEx(JOYSTICKID1,&joyinfo2) != JOYERR_UNPLUGGED; 
		printf("X:%05d Y:%05d Z:%05d R:%05d H:%d %d\n",
			joyinfo2.dwXpos, // X
			joyinfo2.dwYpos, // Y
			joyinfo2.dwZpos, // Z(throttle)
			joyinfo2.dwRpos, // R(Rudder)
			joyinfo2.dwPOV,  // POV(Hat)
			joyinfo2.dwButtons);

		Sleep(100);
	}
#else
	for(;;)
	{
		bDev1Attached = joyGetPos(JOYSTICKID1,&joyinfo) != JOYERR_UNPLUGGED; 
			printf("%d %d %d %d\n",
			joyinfo.wXpos,
			joyinfo.wYpos,
			joyinfo.wZpos,
			joyinfo.wButtons);

		Sleep(100);
	}
#endif
	system("pause");

	return 0;
}


[링크 : http://msdn.microsoft.com/en-us/library/ms709377.aspx]

[링크 : http://msdn.microsoft.com/en-us/library/ms709352.aspx] joyGetPos
  [링크 : http://msdn.microsoft.com/en-us/library/ms709359.aspx] JOYINFO
[링크 : http://msdn.microsoft.com/en-us/library/ms709354.aspx] joyGetPosEx
  [링크 : http://msdn.microsoft.com/en-us/library/ms709358.aspx] JOYINFOEX
[링크 : http://msdn.microsoft.com/en-us/library/ms709350.aspx] joyGetDevCaps
  [링크 : http://msdn.microsoft.com/en-us/library/ms709348.aspx] JOYCAPS
 
신고

'Programming > C / Win32 / MFC' 카테고리의 다른 글

assert()  (0) 2013.12.18
printf의 %s와 %S  (0) 2013.06.15
win32api - joystick 예제  (0) 2013.06.15
Windows IME  (0) 2013.02.14
== 와 = 의 실수를 피하기 위한 트릭  (2) 2013.01.06
c 변수범위 헤더  (0) 2012.07.02
Posted by 구차니

댓글을 달아 주세요

스터디용 -ㅁ-

[링크 : http://www.gpgstudy.com/gpgiki/윈도우 다국어 프로그래밍]
[링크 : http://msdn.microsoft.com/en-us/library/cc194838.aspx]
신고

'Programming > C / Win32 / MFC' 카테고리의 다른 글

printf의 %s와 %S  (0) 2013.06.15
win32api - joystick 예제  (0) 2013.06.15
Windows IME  (0) 2013.02.14
== 와 = 의 실수를 피하기 위한 트릭  (2) 2013.01.06
c 변수범위 헤더  (0) 2012.07.02
엔디안 / endian  (2) 2012.06.14
Posted by 구차니

댓글을 달아 주세요

c언어 강좌를 하다가 윈도우 서버 프로그래머 분이 오셔서 이야기를 듣는데
이건 꼭! 내것으로 만들어야 겠다 싶은게 있어서 기록 (오유 i2kas 님)



if(idx == 0)
이라는 문구가 있을경우
idx = 0 으로 쳐도 문법적인 에러는 발생하지 않고
찾기가 상당히 어려운 버그중에 하나인데


if(0 == idx) 로 순서만 바꾸면 문법적으로는 아무런 하자가 없으면서도
== 를 잘못입력하여 = 로 입력했을시 
if(0 = idx)로 lvalue가 constant로 에러가 발생함으로 유용하게 논리에러를 잡아내는데 사용될수 있다.


오홍!!!! 
신고

'Programming > C / Win32 / MFC' 카테고리의 다른 글

win32api - joystick 예제  (0) 2013.06.15
Windows IME  (0) 2013.02.14
== 와 = 의 실수를 피하기 위한 트릭  (2) 2013.01.06
c 변수범위 헤더  (0) 2012.07.02
엔디안 / endian  (2) 2012.06.14
localtime의 return값을 조심하세요  (2) 2012.06.12
Posted by 구차니

댓글을 달아 주세요

  1. 앗 대문사진을 바꾸셨군요. 같은 포즈로.. 크~~~
    재미있는 내용이네요.
    왠지 변수는 왼쪽에 있어야 이쁘게 보일 듯 하지만^^

    2013.01.08 11:27 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 저도 변수를 왼쪽에 쓰고 있었는데 이야기를 들어보니
      이것도 좋은방법인거 같더라구요 ㅋ

      2013.01.08 12:04 신고 [ ADDR : EDIT/ DEL ]

limits.h 와 float.h 두개에서 변수의 범위에 대한 define을 포함한다.

[링크 :  http://publications.gbdirect.co.uk/c_book/chapter9/limits.html ]
신고
Posted by 구차니

댓글을 달아 주세요

엔디안은 "메모리에 저장되는" 바이트의 순서를 의미한다.
"메모리에" 라는것이 매우 중요한데

HDD와 같은 녀석은 bit stream 처럼 어떻게 보면 big endian 처럼 저장되며
cpu 레지스터에서도 일단~은 big endian 처럼 보인다.

유일(?)하게 영향을 받는게
메모리에서 내용을 받아와 다른 형(type)으로 변환하는 경우인데
어셈블리 언어로 이야기 하자면 mem to register 명령에 영향을 미친다고 하면 되려나?

아무튼 프로그래밍을 5년 넘게 현업으로 하고 있지만
정말 제대로 엔디안을 아는게 아닌게 아니었구나 라는 생각이 문든 드는 화두..
"비트 쉬프트 할 경우 정말 실제로는 어떻게 작동할 것인가?"
요 녀석에 멘붕을 느끼는중

[링크 : http://www.terms.co.kr/big-endian.htm ]
[링크 : http://ko.wikipedia.org/wiki/엔디언 ]

[링크 : http://www.ibm.com/developerworks/kr/library/au-endianc/index.html ] 
신고
Posted by 구차니

댓글을 달아 주세요

  1. 호~... 업력이 5년이 넘으셨군요.. 대단^^
    좋은 주말 보내세요^^

    2012.06.16 13:39 신고 [ ADDR : EDIT/ DEL : REPLY ]

부제 : 아오 미네랄 써글넘의 localtime()

localtime() 함수는 struct tm * 형을 리턴하는데
다르게 말하면, glibc나 library 내의 변수의 포인터를 리턴하는 식이 되는지라 매번 할당해서 돌려주는게 아니라는 의미.
즉, 연속으로 localtime을 사용해서 포인터로 받는다면, 당연히 동일 주소 동일 내용이 되므로
조건식 비교에서 항상 참이 될 수 밖에 없다 -_-

struct tm *localtime(const time_t *timep);
struct tm *localtime_r(const time_t *timep, struct tm *result);

POSIX.1-2001 says: "The asctime(), ctime(), gmtime(), and localtime() functions shall return values in one of two static objects: a broken-down time structure and an array of type char. Execution of any of the functions may overwrite the information returned in either of these objects by any of the other functions." This can occur in the glibc implementation.

[링크 : http://linux.die.net/man/3/localtime ]   


그런 이유로 아래와 같이 복사하거나, 처음부터 포인터가 아닌 값으로 받아 변수에 넣도록 해주는 것도 방법인데
오홍.. 아래 방법은 당연한 문법이지만 왜이리 생소해 보일까? ㅋㅋ

struct tm stTempTime;
pstCurTime = localtime(&lCurTime);
memcpy(&stTempTime, pstCurTime, sizeof(struct tm));

는 간단하게
struct tm stTempTime = *localtime(&lCurTime);

[링크 : http://kldp.org/node/71959 ]  

신고
Posted by 구차니

댓글을 달아 주세요

  1. 포인터를 반화하는 함수를 사용할 때 매우 유의해야할 내용을 정확히 적어 주셨네요. ^^

    2012.06.12 14:32 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 일하기 싫어병에 걸려서 이 단순한(?) 버그를
      일주일째 못 잡고 있다가 문득 생각나서 찾아봤더니 이거네요 ㅠ.ㅠ

      2012.06.12 14:52 신고 [ ADDR : EDIT/ DEL ]

"\x81" 이런식으로 printf를 해주면 0x81 번에 할당된 문자가 출력된다.
컴파일러 혹은 라이브러리 문제인지 해당 문자열의 버퍼는 unsigned char 여야 되며
char 일경우 오작동을 하는 경향이 보인다.

[링크 :  http://msdn.microsoft.com/en-us/library/h21280bw(v=vs.80).aspx]
[링크 :  http://abeldaos.tistory.com/4]
신고
Posted by 구차니

댓글을 달아 주세요