'잡담'에 해당되는 글 2건

  1. 2009.09.30 학교에서 또 한번 좌절... (4)
  2. 2009.04.01 윈도 프로그램 수업중에 경악... (5)

헬마입니다.

오늘도 여전히 학교와 회사를 열심히(?) 다니고 있습니다. ^^

오늘은 오전에 -운영체제- ( 유닉스 운영체제 겠죠 ^^ ) 수업이었는데,

read, open 등의 함수를 설명하다가 실습 예제가 하나 나왔습니다.

#include 

main( argc, argv ) int argc; char* argv[];
{
    int fd, skval;
    char c;

    if( argc != 2 )
        return -1;
    fd = open( argv[1], O_RDONLY );
    if( fd == - 1 )
        return -1;
    printf("File FD Number = %d\n", fd );
    while( ( skval = read( fd, &c, 1 ) == 1 )
    {
         printf("Read Char : %c\n", c );
         skval = lseek( fd, 9L, 1 );
         printf("New Seek Val = %d\n", skval );
    }
}
위와 같은 프로그램이었는데 이걸 5글자씩 읽어서 출력하느걸로 고치는거였습니다. 그러면서 문자배열을 써보라더군요.
뭐 쉬운일이니 원하시는대로 했습니다.
#include 
#include 

main( argc, argv ) int argc; char* argv[];
{
    int fd, skval;
    char szData[6];

    if( argc != 2 )
        return -1;
    fd = open( argv[1], O_RDONLY );
    if( fd == - 1 )
        return -1;
    printf("File FD Number = %d\n", fd );
    memet( szData, '\0', sizeof(szData) );
    while( ( skval = read( fd, szData, 5 ) == 5 )
    {
         printf("Read Char : %s\n", szData );
         skval = lseek( fd, 9L, 1 );
         printf("New Seek Val = %d\n", skval );
         memset( szData, '\0', sizeof(szData) );
    }
}
로 고쳤습니다. 기억에 의존해서 정확한지 잘 모르겠네요.
컴파일도 잘 대고 깔끔하게 5글자씩 출력이 되었습니다.
그런데, 교수님께서 보시더니 왜 문자배열을 6개로 잡았느냐고 하면서 5개로 줄여보라고 하더군요.
그래서 5개로 줄이고 실행하니 당연히 널문자가 없어서 뒤에 쓰레기 문자가 잔뜩 같이 출력...
그러니 이번엔 교수님이 printf 에서 %5s 해서 길이 지정을 하면 되는거 아니냐고 해보라고 하더군요.
해보고 역시 안대죠. 교수님 %5s 는 최소 출력 길이 너비를 지정하는거지 읽는 길이를 지정하는게 아니란 말입니다. ㅠㅠ
printf 에는 읽을 길이 지정하는게 없냐고 하시더니 없다고 하니까 그냥 가시더군요.. ㅠㅠ
유닉스면 C언어와 굉장히 밀접한 운영체제인데, C언어를 제대로 해보신분인지 순간 놀랐습니다.
C언어에서 문자열이 어떤식으로 다뤄지는지 정말 알고계시는건지..
더구나 나중에 5개로 잡으면 찌거기 문자가 나올텐데 이건 정상작동이고 알고리즘 오류가 아니라고 주장하는 모습에 감동했씁니다
그대로 제품 만들면 100% 망할텐데...

'잡담' 카테고리의 다른 글

와우 하다가 한 장면..  (0) 2009.10.10
ATi RADEON HD 5870  (4) 2009.10.01
학교에서 또 한번 좌절...  (4) 2009.09.30
벌집.... 구경하다...  (6) 2009.08.24
VMWare 7.0 Technology Preview Build. 185517  (1) 2009.08.23
미디어법 통과를 보며 생각나는 장면...  (1) 2009.07.23

댓글을 달아 주세요

  1. warship 2009.09.30 16:19 Address Modify/Delete Reply

    printf("%.5s", szData);
    점(.)을 찍으면 딱 5자리만 읽고,

    printf("%.*s", 5, szData);
    이것도 위와 같은 동작을....

    저도 몰랐었는데 얼마전에 알았다는

    • BlogIcon 헬마 2009.09.30 19:19 신고 Address Modify/Delete

      MSDN을 찾아보았는데 일단 의미가 약간 다릅니다.

      ---

      The third optional field of the format specification is the precision specification. It specifies a nonnegative decimal integer, preceded by a period (.), which specifies the number of characters to be printed, the number of decimal places, or the number of significant digits (see the How Precision Values Affect Type table). Unlike the width specification, the precision specification can cause either truncation of the output value or rounding of a floating-point value. If precision is specified as 0 and the value to be converted is 0, the result is no characters output, as shown below:

      ---
      제가 판단하기로

      위의 . 을 이용한 방식은, 읽기는 많이 있습니다. 쭉~~, 읽지만 출력은 딱 5글자만 합니다. 따라서, 겉으로 보기엔 5글자 이상을 초과해서 읽었다는 사실자체에는 변함이 없습니다.

      차이점이라면, %5s 하면 최소 5글자로 그 이상 출력가능지만
      %.5s 하면 무조건 5글자 출력이라는 거겠죠.

      두번째 방법인 * 를 쓰는 방식은 현재는 거의 쓰이지 않는 방식으로 알고 있습니다. 추천되지도 않구요. 보안 위험성때문이지요. printf_s 같은 보안이 강화된 함수에서는 지원이 제거된걸로 알고 있습니다.

      사실 머, 보안위험을 따지자면 printf 자체가 문제인거나 다름없죠 ^^

      C++ 고유의 가변인자 전달 방법만 있었어도 printf 는 사라졌을거라 생각합니다.

  2. blueasa 2009.10.01 02:48 Address Modify/Delete Reply

    가끔씩 헬마님 글보면서 느끼는거지만..
    교수랑 학생이랑 바뀐거 아닌가요? ㅇ_ㅇ;

  3. BlogIcon neoevoke 2009.10.08 16:16 Address Modify/Delete Reply

    교수님을 가르치시느라 고생하십니다 ^^

    소스코드 올리실때는 textarea로 둘러싸 주시면 맨 밑에 </fncntl.h> 이런거 나오는거 없어져요


헬마입니다.

요즘 학교를 재입학하여 회사와 함께하고 있는데요. 덕분에 시간도 별로없네요.

호기심에 들었던 윈도 프로그래밍 수업시간에 경악의 장면을 목격하고 말았네요...

교수님께서 언제나 ppt 를 VS 6.0 으로 하더군요. 교재로 선택한 책도 VS 6.0 을 사용하는 IT Cookbook MFC 어쩌구... (한빛미디어 책 .. 요즘책인데 VS 6.0 이라니 그저 놀랄뿐.. , 책 내용도 신통치 않은판에.. )

MFC 첫 기초 원리를 강좌하는 거였는데 VS 6.0 소스를 가져다가 예제로 설명한다면서 VS 2005 프로젝트를 만들어 거기다 붙이더군요. 요즘은 2005 많이 쓴다면서요.

머 그거까진 좋습니다. 문제는 이 다음부터죠.

아시다시피 VS 6.0  의 프로젝트 기본 문자인코딩은 멀티바이트입니다. VS 2005 는 유니코드이지요.

6.0의 소스를 그대로 갖다붙여넣으니 문자형식이 맞지 않아서 당연히 오류가 납니다.

오류가 이건 타입이 맞지 않아서 그런거라고 하면서 오류를 고치는데.. 당황스럽게 고치더군요...

CMainFrame::CMainFrame()
{
    Create(NULL, "HelloMFC Application");
}

void CMainFrame::OnPaint()
{
    char *msg = "Hello, MFC";
    CPaintDC dc(this);

    dc.TextOut(100, 100, msg, lstrlen(msg));
}

였습니다. 위와 같은 코드를 아래와 같이 고치더군요..

CMainFrame::CMainFrame()
{
    Create(NULL, (LPCTSTR)"HelloMFC Application");
}

void CMainFrame::OnPaint()
{
    char *msg = "Hello, MFC";
    CPaintDC dc(this);

    dc.TextOut(100, 100, (LPCWSTR)msg, lstrlen( (LPCTSTR)msg));
}

그러더니 컴파일을 합니다. 억지 캐스팅을 했으니 어쨌건 컴파일은 성공하겠죠. 컴파일 성공하니 이제 오류가 없어졌다고 실행..
실행해보니 "얼레, 글자가 왜 꺠지지" 이러더랍니다. ㅠㅠ


순간 이런 형편없는 수업들으려고 비싼돈내고 여기 앉아있나 하는 생각에 자신이 비참해지더군요. 이넘의 졸업장이 뭔지...

결국 수업끝나고 제가 메일로 문제점을 하나하나 짚어주고 오늘 수업시간에 질문이 들어오니 마치가 자기가 알아낸것처럼 제가 얘기했던 것을 그대로 읆더군요. 그리고는 그다음부터 예제는 6.0으로....

이런 수업을 듣고 졸업해서 뭔가 배웠다고 생각할 후배들을 생각하니 맘이 아픕니다. 3학년 수업인데 연결 리스트를 잘 모르겠다고 연결 리스트를 다시 강의해달라고 하더군요. ㅠㅠ


댓글을 달아 주세요

  1. 구독자인데.. 2009.04.01 19:19 Address Modify/Delete Reply

    갑자기 슬퍼집니다.. ㅜㅜ

  2. 참한놈 2009.04.02 08:37 Address Modify/Delete Reply

    저런 써글 교수는 새로운 것에 좀더 노력이란 글자를 생각도 안하면서 대충 다니는 군요.
    왜 안짤리나 모르겠어요.. 싼맛에?

  3. BlogIcon 애쉬™ 2009.04.02 11:53 신고 Address Modify/Delete Reply

    교수 찔러버리세요~ㅋ 후배들을 위해 과감히! 물론 무기명인거 아시죠?^^

  4. BlogIcon moonofkr 2009.04.05 00:10 신고 Address Modify/Delete Reply

    헬마님 동의합니다. 전 교수한테 논문 검토해달라고 제출하니깐 그걸로 수업하더만요 2주동안이나 그담부터 제출안하고 그러니깐 한다는 소리가 "너 요즘 공부안하냐?" 이럽니다. 개신교 장로라는 교수가 그럽니다.

  5. BlogIcon Song4U 2009.04.06 19:46 신고 Address Modify/Delete Reply

    저도 헬마님블로그를 잘구독하다가 이글을 보고 달려왔네요. 교수님들이 저러니 발전이없죠. 남을 가르치려면 끊임없는 자기 개발이 필요한데 능력안돼는 교수들은 정리하고 열씸히하는 시간강사같은 분들을 교수로좀 뽑았으면 하는 바램이 있네요.