레이블이 language인 게시물을 표시합니다. 모든 게시물 표시
레이블이 language인 게시물을 표시합니다. 모든 게시물 표시

2010년 4월 1일 목요일

파일삭제 _unlink를 쓰면서 일어난 문제

_unlink 함수를 이용하여 파일 하나를 삭제하고 싶은데...

"Access is denied"가 자꾸 뜬다...

처음엔.. 내가 삭제하려 하는 파일을 close하지 않아서 그런가 싶어서...

파일을 다시 한번 오픈했다가 fclose(tempfp) 함수까지 삽입하였는데도 여전하다.

 

근데..

프로그램을 종료했다 다시 실행시키고..

_unlink 함수만 딸랑 실행하면 잘만 지워댄다.

 

왜 내가 원하는 방식으론 접근을 못하는걸까??????

 

 if((tempfp=fopen(cTempFilePath, "w"))!=NULL)
  {
   tempfileFlag = 1;
  }
  if(tempfileFlag)
  {
   fclose(tempfp);
   if (_unlink(cTempFilePath))
   {
    switch (errno)
    {
    case EACCES: AfxMessageBox("Access is denied"); break;
    case ENOENT: AfxMessageBox("Could not find"); break;
    default:  AfxMessageBox("Unknown error."); break;
    }
   }
   else
   {
    AfxMessageBox("Deleted");
   }
  }
 

2010년 3월 19일 금요일

0x10을 10으로 만들려면?

0x10을 10으로 만들려면 어떻게 해야할까?

미치겠네

알고나면 허무할것같은데 -_-;

 

지금은 모르겠어...

CString -> int 변환, int -> CString 변환

CString → int
int형 = _ttoi(CString형);


int → CString
CString형.Format( _T("%d"), int형);

2010년 2월 4일 목요일

[VC] List Box Horizontal scroll 왜 안될까?

비쥬얼 C++ 6.0에서 Listbox 같다붙여놓고

 

수평, 수직 스크롤바가 생기도록 체크했는데...

 

수직은 잘 되는데 수평은 안된다... 안돼.

왜???????

스크롤바가 생기지도 않을뿐더러, 억지로 생기게했지만 화면 이동하질 않아...

도대체 왜왜왜왜왜? ㅠㅠ

그 어디에서도 답을 찾을 수 없어.

아 궁금해...

2010년 1월 6일 수요일

[VC] VC++ 6.0으로 그래프 그리기...가 안된다

아.... 미치겠다. 2DPushGraph라는 그래프 클래스를 주워다가 쓰는데 debug와 release로 컴파일 했을때 결과가 다르다. -_-

 

이건 디버그로 컴파일 했을때. 이게 정상이다. 이렇게 나와야 한다. y축 값 나오고, 그래프 영역엔 그리드 나오고.....

 

근데 릴리즈로 컴파일하면 아래처럼 된다.

기능은 제대로 하는데 축 값이랑 그리드 다 어디갔는지 모르겠다. 소스 바뀐거 없고 컴파일 모드만 바꿨을 뿐인데 대체 왜! 왜! 왜!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

어쩐다... -_- 내 맘대로 안되는 이 그지같은 경우... ㅠㅠㅠㅠㅠㅠ

 

아래 첨부파일은 주워다가 쓴 클래스...

2009년 12월 3일 목요일

[VC] ListBox의 ScrollBar 가장 최근에 포커스 주기

 

ListBox의 ScrollBar 가장 최근에 포커스 주는 방법.

엄청 삽질했다. -_-;;

 

시리얼로 데이터가 들어오면 리스트박스에다가 뿌려주는데 정해진 공간을 넘으면 세로로 스크롤바가 생긴다. 근데 이게 맨 첫줄만 계속 보여주지 최근에 들어온 데이터가 들어오는 맽 끝줄은 보이지 않는거다.

 

※ 왼쪽 빨간 박스와 오른쪽 빨간 박스의 차이점을 알겠는가. 사용자가 손으로 긁어 옮긴것이 아니다.

 

젱장.

 

뒤지고, 뒤지고, 또 뒤지고.

 

겔겔거리다가 찾아냈다.

 

오른쪽 Listbox는 control 변수로 m_ctrlCmd02란 이름을 가지고 있고 x는 int형.

 

x = m_ctrlCmd02.GetCount();
m_ctrlCmd02.SetScrollPos(SB_VERT, x);

 

이렇게 해주면 왼다. 카운트 몇개냐? 해서 그 카운트에 스크롤바의 포커스를 옮겨주면 된다.

우여곡절끝에 하긴 했는데 사용하면서 다른 문제가 날지 안날지는 있어봐야 알겠지.

 

훗.

 

 

 

 

+ 덧 +

 

망했다 ㅠㅠㅠㅠㅠㅠ

스크롤바는 내려가는데 화면은 안내려간다 -_-;

뭥미...... 아 어쩐담.

 

 

 

+ 덧 +

다 필요없다.

 

m_ctrlCmd02.SetCurSel(m_ctrlCmd02.AddString(m_strCmd02buff));

 

이거 한 줄이면 처음에 했던 스크롤 어쩌구도 필요없이 포커스까지 갖추면서 스크롤도 함께 내려간다.

굳 乃

2009년 10월 14일 수요일

BMP 파일 헤더 포멧

BMP (Windows) Header Format

offset

size

description

0

2

signature, must be 4D42 hex

2

4

size of BMP file in bytes (unreliable)

6

2

reserved, must be zero

8

2

reserved, must be zero

10

4

offset to start of image data in bytes

14

4

size of BITMAPINFOHEADER structure, must be 40

18

4

image width in pixels

22

4

image height in pixels

26

2

number of planes in the image, must be 1

28

2

number of bits per pixel (1, 4, 8, or 24)

30

4

compression type (0=none, 1=RLE-8, 2=RLE-4)

34

4

size of image data in bytes (including padding)

38

4

horizontal resolution in pixels per meter (unreliable)

42

4

vertical resolution in pixels per meter (unreliable)

46

4

number of colors in image, or zero

50

4

number of important colors, or zero

 





BMP (OS/2) Header Format

offset

size

description

0

2

signature, must be 4D42 hex

2

4

size of BMP file in bytes (unreliable)

6

2

reserved, must be zero

8

2

reserved, must be zero

10

4

offset to start of image data in bytes

14

4

size of BITMAPCOREHEADER structure, must be 12

18

2

image width in pixels

20

2

image height in pixels

22

2

number of planes in the image, must be 1

24

2

number of bits per pixel (1, 4, 8, or 24)

 

 

 

How Microsoft develops its Software

How Microsoft develops its Software

 

 

1부. 일정 맞추기 OnTime


1. 아는 체 하지 마라 Don’t know what you don’t know

2. 상황을 파악한 다음에 움직여라 Get to a known state and stay there

3. 제품-일정-비용 삼각형을 기억하라 Remember the triangle.

4. 어둠 속으로 돌진하지 마라 Don’t go dark

5. 무결점 이정표를 사용하라 Use zero defect (ZD) milestones.

6. 팀워크를 유지하라 Beware of a guy in a room

7. 일정에는 조삼모사가 없다  Never trade a bad date for an equally bad date

8. 일정이 밀리면, 전열을 가다듬어라 When slipping, don't fall

9. 밑바닥 기술이 중요하다 Low tech is good

10. 설계할 때는 설계만 한다 Design time at design time

11. 만들어야 출시할 수 있다 If you build it, it will ship

12. 호환성은 카누 만들 때나 필요하다 Portability is for canoes

 

 

2부. 위대한 소프트웨어  Great Software


13. 고객을 감동시켜라 Enrapture the customers

14. 통일성이라는 한가지 명제만 기억하라 Remember one thing: Unity

15. 설계 사상을 명확하게 잡아라 State your theme

16. 비교하라 Vary it

17. 균형을 맞춰라 Balance it

18. 발전시켜라 Evolve it

19. 제품을 층층이 쌓아라 Your product should be a hierarchy

20. 공유할 비전을 정하라 Establish a shared vision

 

 

3부. 출시  Shipping


21. 팀을 항상 출시 모드로 유지하라 Get the team into ship mode 

 

http://blogs.msdn.com/David_Gristwood/archive/2004/06/24/164849.aspx

2009년 10월 13일 화요일

프로그래머 십계

아래는 예전 미니홈피에 올렸던 글인데 이 블로그와 성격이 더 맞는 것 같아 옮겨왔다.

내가 작성한 것은 아니고 웹서핑 도중에 얻게된 글인데 출처 표기에 대한 습관이 들지 않았던 때라 원작자를 모르겠다. -_-;;;; 원작자분이 보신다면 양해 부탁드린다.

 

1. 정보를 모음에 소홀히 하지 말고 설명서를 읽음에 게을리 하지 말지어다. 오늘 필요 없는 정보는 내일 필요하리라. 가장 가치 있고도 저렴한 지식은 책 속에 있느니라. 서점과 동료의 책꽂이에 무엇이 꽂혀 있는지 때때로 살피어라. 무심코 흘렸던 종이 한 장이 너의 근심을 풀어 주었으리라. 설명서는 충분히, 꼼꼼히 읽을지어다. 모든 의문은 설명서를 안 보는 데서 생기니라. 그렇더라도 모두 다 읽을 필요는 없느니라.


2. 너의 PC가 안전하다고 믿지 말지어다. 5분 후에 정전이 되고 내일 너의 하드가 맛이 가리라. 그러하니 너의 소중한 소스 코드는 정기적으로 여러 군데에 단계별로 백업해 두어라.


3. 변하는 수를 다룰 때에는 늘 조심할지어다. 정수가 절대로 그 한계를 넘지 않으리라 가정하는 것은 어리석음이라. 127, -128, 255, 32767, -32768, 65535, 이 숫자들을 너의 골수에 새기어라. 0.0은 0이 아니니 실수는 원래부터 결코 정밀하지 않느니라. 부호 없는 것과 있는 것을 어울리거나 정수끼리 나눌 때에는 늘 조심하여라.


4. 무슨 일을 반복시킬 때에는 처음과 끝에 유의할지어다. 너의 컴퓨터는 1보다는 0을 좋아 하니라. 배열의 첨微� 그 범위를 넘지 않을지 손 댈 때마다 따져 보아라. 수식에 1을 더하거나 뺄 때에는 늘 긴장하라. 너의 프로그램은 단지 한 번 덜해서 틀리고 한 번 더해서 다운되느니라.

 

5. 항상 모든 경우의 수를 고려하고 섣불리 생략하지 말지어다. 절대로 일어나지 않을 일은 반드시 일어나고, 가장 드물게 일어날 일이 가장 너를 괴롭히리라. 그러하니 언제나 논리에 구멍이 없는지 꼼꼼히 따져 보고, if를 쓸 때에는 else부터 생각하라.

 

6. 함수 안에서 매개 변수값은 결코 믿지 말지어다. 지금 그 매개 변수가 결코 가질 수 없다는 값을 내일부터는 가지리라. 그러하니 매개 변수값이 올바름을 항상 검사할지어다. 그렇더라도 처리 속도가 문제가 되는 경우는 예외이니라.

 

7. 오류를 알려 주는 기능은 있는 대로 모두 활용할지어다. 컴파일러의 경고는 모두 켜 두어라. 경고는 곧 오류이니라. 오류를 알리는 함수의 결과를 확인하지 않는 우를 범하지 말지어다. 모든 파일 입출력과 모든 메모리 할당은 조만간 실패할 것이라.

 

8. 한 번의 수정과 재컴파일만으로 연관된 모든 것이 저절로, 강제로 바뀌도록 할지어다. 어떠한 것을 수정했을 때에 연관된 것이 따라서 변하지 않는다면 그것이 곧 벌레이니라. 컴파일러로 하여금 매개 변수 리스트를 완전하게 검사하도록 하고, 언젠가 손대야 하거나 따라서 변해야 하는 수치는 전부 매크로로 치환하며, 형 정의를 적극 활용하여라.


9. 사용자가 알아서 잘 써 주리라고 희망하지 말지어다. 너의 프로그램은 항상 바보와 미친놈만이 쓰느니라. 사용 설명서를 쓸 때에는 결코 빠뜨리지 말아라. 빠뜨린 만큼 사용자는 너를 괴롭힐 것이니라.

 

10. 매사에 겸손하고 항상 남을 생각할지어다. 가장 완벽한 프로그램일수록 가장 완벽하게 숨은 벌레가 있느니라. 네가 이 세상 최고의 프로그래머라고 떠들며 자만할 때, 옆집 곳간에서는 훨씬 더 뛰어난 것을 묵묵히 만들고 있느니라. 아무렴 프로그래밍은 혼자 잘나서 할 게 아니니, 너로 인해 다른 사람들도 더불어 잘 되면 그얼마나 좋은 것이냐.

2009년 10월 12일 월요일

[VC] 'class' type redefinition Error

클래스를 여러개 만들고 이쪽저쪽에서 참조를 하다보니 헤더파일을 include를 두서없이 남발하게 되었고,

결국은 'class' type redefinition error가 나서 한참을 삽질했다.


이 에러는 헤더파일과 소스파일에 같은 헤더파일을 include 시켰을 경우에 난다고 한다.


그래서 흩어진 include를 StdAfx.h에 밀어넣어 줬더니 warning, error 없이 컴파일 되었다.


휴.

[VC] virtual과 static선언

virtual : 상위 클래스에서 사용하는 함수와 자신의 함수를 동시에 사용하기 위해서 설정하는 형


 

static : 클래스 내에 있는 함수를 바로 외부에서 호출할 수 있게 하는 형

클래스 내에서 설정한 함수들 중 외부에서 사용해도 유용한 함수들이라면 이 형을 선언

[VC] sprintf()

void CSerialDlg::OnButtonTest()
{
 // TODO: Add your control notification handler code here
 CString str;
 char xxx[256];
 unsigned char Data[20];

 
memset(xxx, 0x00, sizeof(xxx));
 
memset(Data, 0x00, sizeof(Data));
 memcpy(Data, "\x83\xF1\x11\xC1\xEF\x8F\xC4", 7);
 
 m_ComuPort.WriteComm(Data, 7);

 for
(int i = 0; i < 7; i++)
 {
  sprintf(xxx, "%02X ", Data[i]);
  str += xxx;
 }

 m_strTX += str + "\r\n";

 
UpdateData(FALSE);
}


Data 배열에는
Data[0] = 0x83
Data[1] = 0xF1
Data[2] = 0x11
.
.
.
이런식으로 값이 들어가게 된다.

내가 원하는 건 Edit box에 83 F1 11 ... 이런 식으로 넣는것.

m_strTX = Data로 하면 CString 그러니까 아스키 값으로 들어가서 곤란해 하고 있었는데 그러다 sprintf를 발견했다.


sprintf(xxx, "%02X ", Data[i]); 이렇게 해결할 수 있었다.

sprintf -> Write formatted data to a string. 라고 msdn에 나와있었음.
sprintf가 있다는 사실은 알아도 막상 쓸려고 하면 왜 생각이 안나는지.

으흐흐흐흑 ㅠ.ㅠ


자세한 설명은 링크 참조 ^^;
http://msdn.microsoft.com/en-us/library/ybk95axf(VS.71).aspx

2009년 10월 9일 금요일

if / else / endif

스택을 하위 메모리에서 상위 메모리 순서로 쓰는 경우 (OS_STK_GROWTH == 0)                      
OS_STK TaskStack[TASK_STACK_SIZE];                                                            
OSTaskCreate(task, pdata, &TaskStack[0], prio);                                               
                                                                                              
스택을 상위 메모리에서 하위 메모리 순서로 쓰는 경우 (OS_STK_GROWTH == 1)                      
OS_STK TaskStack[TASK_STACK_SIZE];                                                            
OSTaskCreate(task, pdata, &TaskStack[TASK_STACK_SIZE-1], prio);                               
                                                                                              
이렇게 쓰면 된다.                                                                             
                                                                                              
                                                                                              
하지만 이런 경우 그때 그때 마다 바꿔서 코딩해줘야 함으로 코드의 이식성이 좋다고 말할 수는 없다.
                                                                                              
이런 경우 if / else / endif 문을 쓰면 한결 좋아진다.                                          
                                                                                              
                                                                                              
OS_STK TaskStack[TASK_STACK_SIZE];                                                            
                                                                                              
#if OS_STK_GROWTH == 0                                                                        
 OSTaskCreate(task, pdata, &TaskStack[0], prio);            
#else                                                    
 OSTaskCreate(task, pdata, &TaskStack[TASK_STACK_SIZE-1], prio);

#endif                                                        
                                                                                               
                                                                                               
                                                                                              
이런식으로.                                      

BMP 파일 구조

비트맵 파일 헤더 (Bitmap File Header)

비트맵 인포헤더 (Bitmap Info Header)

팔레트 (Pallette)

이미지 데이터

 

typedef struct tagBITMAPFILEHEADER {

WORD bfType;        // BM 이라고 써있으면 bmp

DWORD bfSize;        // 이미지 크기

WORD bfReserved1;

WORD bfReserved2;

DWORD bfOffBits;    // 이미지 데이터가 있는 곳의 포인터

} BITMAPFILEHEADER

 

typedef struct tagBITMAPINFOHEADER{

DWORD biSize;        // 현 구조체의 크기

LONG biWidth;        // 이미지의 가로 크기

LONG biHeight;        // 이미지의 세로 크기

WORD biplanes;        // 플레인수

WORD biBitCount;    // 비트 수

DWORD biCompression;    // 압축 유무

DWORD biSizeImage;    // 이미지 크기

LONG biXPelsPerMeter;    // 미터당 가로 픽셀

LONG biYPelsPerMeter;    // 미터당 세로 픽셀

DWORD biClrUsed;    // 컬러 사용 유무

DWORD biClrImportant;    // 중요하게 사용하는 색

} BITMAPINFOHEADER;

2009년 10월 7일 수요일

equ란 무엇인가? 어떻게 쓰는가?

PIC을 다뤄본 적이 없는데 일은 해야하는 상황이라 많이 난감했다. 책도 없고 DataSheet는 너무 많기만 하고... 웹으로 얻을 수 있는 자료도 속 시원하게 이해되지 않았다.

 

그랬는데 네이버 카페 <Microchip PIC 사용자 커뮤니티> 라는 곳을 통해 많은 것을 얻을 수 있었다.

 

답답했던 equ에 대한 질문의 답을 들을 수 있었다.

 

아는 바를 설명해 보자면 아래와 같다.

 

equ란 c언어에서 말하는 define과 같은 뜻이다.

 

우선

 

a    equ    .100

라고 되어있다고 치자.

 

이것은 #define a 100라는 뜻이다. '.'이 의미하는게 십진수라 한다.

 

오호 쉽네?

 

그러다가 난관에 봉착했다.

 

b    equ   -.50

이건 뭘까. '.'앞에 '-'가 붙어있다.

 

그럼 #define b -50 이 되는건가?

 

아니다. 어셈에서 음수는 지원하지 않기 때문에 그것은 '보수'의 의미가 된다.

 

다시말해 #define b 256-50 이 되는 것이다.

 

놀라운 어셈의 세계 -_-;;;

 

더 궁금하다면 MPLAB IDE를 설치했던 폴더 내에 MPASM Suite\hlpMPASMAsm.chm이라는 파일을 보라고 친절히 알려주셨다...만 아직 확인은 못해보고 있다. 귀차니즘.

 

어찌되었든, 이렇게 알아가는 건 시간이 지나서도 잊어버리지 않을 것 같다.