cinfo.output_gamma [930841904] <- int 형으로 출력
cinfo.output_gamma [1.000000]   <- double 형으로 출력


libjpeg 사용하다 디버그 문장을 제대로 안골라서 발생한 오류 -ㅁ-
신고
Posted by 구차니

댓글을 달아 주세요

Before


void main()
{
int test = 13;
printf("\ntest [%ld:0x%lX]",test,test);
}

After
#define debug_print(name) printf("\n%s [%ld:0x%lX]",#name,name,name);
void main()
{
int test = 13;
debug_print(test);
}

#define debug_print(name) printf("\n%s [%ld:0x%lX]",#name,name,name);
전처리기에서 #name은 name의 내용을 문자열로 치환해주는 역활을 한다.

다른 용법은 아래 참고, ## 라는 용법도 있는데 두개를 하나로 붙여 준다.
[참고 : http://cafe.naver.com/devctrl/1921]
신고
Posted by 구차니

댓글을 달아 주세요

글쓸 꺼리를 준 친구 녀석에게 감사를 ㅋㅋ

간단하게 설명을 하자면,
for문을 돌릴때 어느 시점에서 증가가 이루어지고, ++연산자가 적용되는 시점, 그리고 연산자 우선순위 대한 문제이다.
(개인적으로 이런 문제 싫어 한다. 가독성 지랄 같이 하면 다른 사람이 어떻게 수정하라고 ㄱ-)
아무튼 for문의 ([초기화];[조건];[증가]) 에서 증가문은 마지막 닫히는 } 부분에서 증가가 이루어 지고,
이로 인해서 더해지는 값이 달라지는 현상이 발생이 되게 된다.
65짜리는 2에서 11 까지 더하게 되고
55짜리는 1에서 10 까지 더하게 된다.

같은 i < 11 조건이지만,
증가되고 더해지고, 더해지고 증가됨의 차이가 있기 때문에 결과는 55와 65로 벌어지게 된다.


원본 코드 - 결과 65 짜리
sum = 0 ;
i = 1 ;
for( ; i<11 ;)
    sum += ++i ;

변형된 코드 1 - for문에 초기화 넣어줌
for(sum = 0,i=1;i<11;)
    sum += ++i;

변형된 코드 2 - while문으로 변형
sum = 0 ;
i=1;
while(i<11)
{
    sum += ++i;
}
변형된 코드 3 - goto문으로 변형
sum = 0 ;
i = 1;
while_loop:
{
    if(i<11) ;
    else break;

    ++i;
    sum += i;
}
goto while_loop:

원본 코드 - 결과 값 55 짜리
sum = 0 ;
i = 1 ;
for( ; i<11 ; ++i)
sum += 1 ;

변형된 코드 1 - for문에 초기화 넣어줌
for(sum = 0,i=1;i<11;++i)
    sum += 1;


변형된 코드 2 - for문에 초기화 넣어줌
sum = 0 ;
i=1;
while(i<11)
{
    sum += 1;
    ++i;
}

변형된 코드 3 - goto문으로 변형
sum = 0 ;
i =1;
while_loop:
{
    if(i<11) ;
    else break;

    sum += 1;
    ++i;
}
goto while_loop:
신고
Posted by 구차니

댓글을 달아 주세요

sizeof()는 type의 크기나 문자열의 길이를 알아 낼때 쓰이는 유용한 녀석이다
근데 문제는 생긴 꼴은 function() 이라서 대충 보면 함수 같은데
엄밀하게 이녀석은 operator이다.(연산자)

그런 이유로, sizeof()는 runtime시에 값이 치환되는것이 아닌 compile time에 값이 치환된다.


#include "stdio.h"
#include "stdlib.h"
#include "string.h"

void main()
{
	char str[] = "Hello World";
	char *str2 = NULL;

	printf("sizeof(char)  %d\n",sizeof(char));
	printf("sizeof(short) %d\n",sizeof(short));
	printf("sizeof(int)   %d\n",sizeof(int));
	printf("sizeof(str)   %d\n",sizeof(str));
	printf("sizeof(*str)  %d\n",sizeof(*str));
	
	str2 = (char*)malloc(12);
	printf("sizeof(str2)  %d\n",sizeof(str2));
	printf("sizeof(*str2) %d\n",sizeof(*str2));

	free(str2);
}

sizeof(char)  1
sizeof(short) 2
sizeof(int)   4
sizeof(str)   12
sizeof(*str)  1
sizeof(str2)  4
sizeof(*str2) 1

처럼 runtime시에 할당되는 크기는 알 수가 없다.
위의 것은 12바이트 문자열이므로(11 + 1byte NULL) 12가 나왔지만
아래는 *char 즉, 포인터 형으로 4byte가 나온것이다.

[링크 : http://www.velocityreviews.com/forums/t635338-sizeof-calculated-at-compile-time-or-run-time.html
신고
Posted by 구차니

댓글을 달아 주세요

main 함수의 기본 프로토타입은 int main(int argc, char *argv[]) 이다.
물론 귀찮아서 void main()으로 주로 쓰긴 하지만, 인자를 받기 위해서는 저 프로토타입을 써야 한다.
아무튼 막상 인자로 받다가 그 인자를 만들어 내려니 자꾸만 안되서 머리를 데굴데굴 굴려봤다.




음.. argv가 argument array인데,
argv[0]은 실행프로그램(자기자신)의 경로+이름
argv[1] 부터 인자가 들어 간다.
그리고 마지막은 null이 들어간다.

    int argc = 2;
    char str1[] = "a.out";
    char str2[] = "/dev/fb0";
    char str3[] = "";
    char *strs[] = {str1,str2,str3};
    char **argv = strs;
아무튼 꼼지락 대면서 겨우겨우 맞춰서 넣은 argc, argv 값들.. 하아..
조금 더 추려내면

    int argc = 2;
    char *strs[] = {"a.out", "/dev/fb0", ""};
    char **argv = strs;


간단하게 하는 방법은 정녕없는 것인가!
신고
Posted by 구차니

댓글을 달아 주세요

  1. 오옷.. 제가 아는 C언어 이야기.
    main은 그냥 main이면 안되나요. 왜 머리에 int, void 등이 붙는지 -ㅅ-...

    2009.03.24 17:52 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • ㅎㅎ 데니즈 님을 위해서 c언어 강좌를 시작해 봐야하는건가요? ㅋ

      앞부분에 붙는건 함수는 블랙박스로, 어떤 값을 받으면 어떤 값을 돌려주는 식으로 설계를 하기 때문입니다.

      예를 들어 실 생활을 예를 들자면
      cm->ft 변환기가 있다고 하면
      입력은 cm 단위로 입력하고
      내부에는 어떻게 변화가 되던 신경안쓰고
      출력은 ft단위(대략 30cm = 1ft)로 받게 됩니다.

      일부 함수들은 값을 돌려주지 않기 때문에
      돌려주는 값이 없는 함수를 void로 해주는 것입니다
      (물론 파고들면 void라고 해서 꼭 값을 돌려주지 않는 건 아니니 나중에 알아보세요 ㅋ)

      2009.03.24 18:20 신고 [ ADDR : EDIT/ DEL ]
    • 오옷..
      해주신다면 저야 영광입니다. ㅠ

      흠... 그런거군요.
      얼른 C언어의 기초를 배워야겠습니다.
      헤헷..

      2009.03.24 20:14 신고 [ ADDR : EDIT/ DEL ]

있을 줄 알았는데 없다는 사실에 웬지 "초~ 쇼크~"(하레와 구우 버전)


Besides, unix way is to be ascetic and elegant, avoiding putting messy and slow algorithms under the hood, and filecopy is definitely slow ( you want syscall with fast filecopy - great, here's hardlink for you ).

[링크 : http://www.perlmonks.org/?node_id=389823]


생각해보니.. UNIX의 설계 철학중 simple is beautiful이 근간이 되어 있다는게 생각이 났다.
cp() 가 빈번하게 사용될지라도, 느린 함수이고(최소한 fopen/fread/fwrite/fclose 4개의 함수를 사용한다)
이러한 복잡한 함수는 단순함의 철학에 위배가 되기에 많이 사용함에도 불구하고
cp() 라는 함수가 존재하지 않는것 같다.



그래도...
rename() remove() 이런건 있으면서 cp()가 없다는 건 웬지 억울한 느낌?

에러처리 없는 cp() 함수


신고
Posted by 구차니

댓글을 달아 주세요

상당히 즐겨보고 애용하는 문서 입니다.
ANSI C에 관련된 함수 정리 및 어떤 파일에 어떤 함수가 있는지를 쉽게 알 수 있고
함수의 프로토타입과 설명이 있어서 C언어 프로그래머들에게 매우 유용한 자료입니다.

2.   Library
     2.1  assert.h
          2.1.1     assert
     2.2  ctype.h
          2.2.1     is... Functions
          2.2.2     to... Functions
     2.3  errno.h 
          2.3.1     EDOM
          2.3.2     ERANGE
          2.3.3     errno   
     2.4  float.h
          2.4.1     Defined Values
     2.5  limits.h
          2.5.1     Defined Values
     2.6  locale.h
          2.6.1     Variables and Definitions
          2.6.2     setlocale
          2.6.3     localeconv
     2.7  math.h
          2.7.1     Error Conditions
          2.7.2     Trigonometric Functions
               2.7.2.1   acos
               2.7.2.2   asin
               2.7.2.3   atan
               2.7.2.4   atan2
               2.7.2.5   cos
               2.7.2.6   cosh
               2.7.2.7   sin
               2.7.2.8   sinh
               2.7.2.9   tan
               2.7.2.10  tanh
          2.7.3     Exponential, Logarithmic, and Power Functions
               2.7.3.1   exp
               2.7.3.2   frexp
               2.7.3.3   ldexp
               2.7.3.4   log
               2.7.3.5   log10
               2.7.3.6   modf
               2.7.3.7   pow
               2.7.3.8   sqrt
          2.7.4     Other Math Functions
               2.7.4.1   ceil
               2.7.4.2   fabs
               2.7.4.3   floor
               2.7.4.4   fmod
     2.8  setjmp.h
          2.8.1     Variables and Definitions
          2.8.2     setjmp
          2.8.3     longjmp
     2.9  signal.h
          2.9.1     Variables and Definitions
          2.9.2     signal
          2.9.3     raise
     2.10 stdarg.h
          2.10.1    Variables and Definitions
          2.10.2    va_start
          2.10.3    va_arg
          2.10.4    va_end
     2.11 stddef.h
          2.11.1    Variables and Definitions
     2.12 stdio.h
          2.12.1    Variables and Definitions
          2.12.2    Streams and Files
          2.12.3    File Functions
               2.12.3.1  clearerr
               2.12.3.2  fclose
               2.12.3.3  feof
               2.12.3.4  ferror
               2.12.3.5  fflush
               2.12.3.6  fgetpos
               2.12.3.7  fopen
               2.12.3.8  fread
               2.12.3.9  freopen
               2.12.3.10 fseek
               2.12.3.11 fsetpos
               2.12.3.12 ftell
               2.12.3.13 fwrite
               2.12.3.14 remove
               2.12.3.15 rename
               2.12.3.16 rewind
               2.12.3.17 setbuf
               2.12.3.18 setvbuf
               2.12.3.19 tmpfile
               2.12.3.20 tmpnam
          2.12.4    Formatted I/O Functions
               2.12.4.1  ...printf Functions
               2.12.4.2  ...scanf Functions
          2.12.5    Character I/O Functions
               2.12.5.1  fgetc
               2.12.5.2  fgets
               2.12.5.3  fputc
               2.12.5.4  fputs
               2.12.5.5  getc
               2.12.5.6  getchar
               2.12.5.7  gets
               2.12.5.8  putc
               2.12.5.9  putchar
               2.12.5.10 puts
               2.12.5.11 ungetc
          2.12.7    Error Functions
               2.12.7.1  perror
     2.13 stdlib.h
          2.13.1    Variables and Definitions
          2.13.2    String Functions
               2.13.2.1  atof
               2.13.2.2  atoi
               2.13.2.3  atol
               2.13.2.4  strtod
               2.13.2.5  strtol
               2.13.2.6  strtoul
          2.13.3    Memory Functions
               2.13.3.1  calloc
               2.13.3.2  free
               2.13.3.3  malloc
               2.13.3.4  realloc
          2.13.4    Environment Functions
               2.13.4.1  abort
               2.13.4.2  atexit
               2.13.4.3  exit
               2.13.4.4  getenv
               2.13.4.5  system
          2.13.5    Searching and Sorting Functions
               2.13.5.1  bsearch
               2.13.5.2  qsort
          2.13.6    Math Functions  
               2.13.6.1  abs
               2.13.6.2  div
               2.13.6.3  labs
               2.13.6.4  ldiv
               2.13.6.5  rand
               2.13.6.6  srand
          2.13.7    Multibyte Functions
               2.13.7.1  mblen
               2.13.7.2  mbstowcs
               2.13.7.3  mbtowc
               2.13.7.4  wcstombs
               2.13.7.5  wctomb
     2.14 string.h
          2.14.1    Variables and Definitions
          2.14.2    memchr
          2.14.3    memcmp
          2.14.4    memcpy
          2.14.5    memmove
          2.14.6    memset
          2.14.7    strcat
          2.14.8    strncat
          2.14.9    strchr
          2.14.10   strcmp
          2.14.11   strncmp
          2.14.12   strcoll
          2.14.13   strcpy
          2.14.14   strncpy
          2.14.15   strcspn
          2.14.16   strerror
          2.14.17   strlen
          2.14.18   strpbrk
          2.14.19   strrchr
          2.14.20   strspn
          2.14.21   strstr
          2.14.22   strtok
          2.14.23   strxfrm
     2.15 time.h 
          2.15.1    Variables and Definitions
          2.15.2    asctime
          2.15.3    clock
          2.15.4    ctime
          2.15.5    difftime
          2.15.6    gmtime
          2.15.7    localtime
          2.15.8    mktime
          2.15.9    strftime
          2.15.10   time
머.. 위에 링크 내용만 보면 필요 하신분들은 알아서 아래 다운을 클릭 하시기를 -ㅁ-

참고 사항으로
c_guide.tar.gz 26-Feb-2002 14:50 202K <- 업데이트 안된지 오래된 문서입니다만, reference인 관계로 오래된 만큼 치명적인
문제점은 없다고 보여 집니다.

[다운 : http://www.acm.uiuc.edu/webmonkeys/book/c_guide.tar.gz]
[링크 : http://www.acm.uiuc.edu/webmonkeys/book/c_guide/index.html]
신고
Posted by 구차니

댓글을 달아 주세요

array(행렬/배열)는 동일 타입의 변수를 나열한 것이다.
시작부분의 인덱스는 0이고 마지막 인덱스는 n - 1 이다.

즉, 행렬의 인덱스는 마이너스 값이 될 수 없다는 의미이다.

그런 이유로 array[idx] 에서 idx의 타입이 unsigned 형이 아니라면
이러한 경고를 출력해 주는 것이다.

[링크 : http://www.devolution.com/pipermail/sdl/2003-August/056006.html]
신고
Posted by 구차니

댓글을 달아 주세요

open이 있으면 close가 있는 법. 레지스트리 역시 open / create를 했으면 close를 해주어야 한다.
hKey [in]

A handle to the open key to be closed. The handle must have been opened by the RegCreateKeyEx, RegCreateKeyTransacted, RegOpenKeyEx, RegOpenKeyTransacted, or RegConnectRegistry function.


Remarks

The handle for a specified key should not be used after it has been closed, because it will no longer be valid. Key handles should not be left open any longer than necessary.

The RegCloseKey function does not necessarily write information to the registry before returning; it can take as much as several seconds for the cache to be flushed to the hard disk. If an application must explicitly write registry information to the hard disk, it can use the RegFlushKey function. RegFlushKey, however, uses many system resources and should be called only when necessary.


[RegOpenKey : http://msdn.microsoft.com/en-us/library/ms724895(VS.85).aspx]
[RegCloseKey : http://msdn.microsoft.com/en-us/library/ms724837(VS.85).aspx]
[RegCreateKey : http://msdn.microsoft.com/en-us/library/ms724842(VS.85).aspx]
[RegDeleteKey : http://msdn.microsoft.com/en-us/library/ms724845(VS.85).aspx]
신고
Posted by 구차니

댓글을 달아 주세요

구글링을 하면서 찾아 보니
GetCurrentDirectory라는 Win32 API가 존재 하는데,
이녀석으로 할 경우 FILE dialog에서 경로를 변경시 다른 경로가 나올 우려가 있다고 한다.

그래서 GetModuleFileName 이라는 함수를 사용하라는데,
먼소리여 -ㅁ-!

[참조 : http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=806]

Code:
char path[MAX_PATH];
GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
MessageBox(NULL, path, NULL, NULL);

[출처 : http://www.codeguru.com/forum/showthread.php?threadid=462232]


Run-Time Library Reference
_pgmptr, _wpgmptr
The path of the executable file. Deprecated; use _get_pgmptr and _get_wpgmptr.

Variable Required header Compatibility

_pgmptr, _wpgmptr

<stdlib.h>

Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003, Windows Server 2003

좀 더 간단한 녀석이 있어 보인다.

[원본 : http://msdn.microsoft.com/en-us/library/tza1y5f7(VS.80).aspx]



간단한 테스트 결과

1. VC++ 6.0 컴파일 환경 설정

2. 소스코드 작성
#include <windows.h>

void main()
{
    char path[MAX_PATH];
    GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
    printf("path[%s]\n",path);
    GetCurrentDirectory(MAX_PATH,path);
    printf("path[%s]\n",path);
}

3. 결과
path[C:\Documents and Settings\morpheuz\바탕 화면\tt\Debug\t.exe]
path[C:\]
Press any key to continue


신고
Posted by 구차니

댓글을 달아 주세요

  1. GetCurrentDirectory 함수를 이용하여 디렉토리를 얻어오는 경우 해당 프로그램 내에서
    File Dialog 등을 이용하여 Open/Save 등의 행동을 취했을때에 마지막에 Action이 이루어졌던 폴더를 되돌려줄 가능성이 있으므로, 해당 실행화일/모듈의 정확한 경로를 얻기 위해서는 GetModuleFileName을 이용하라는 얘기인것 같습니다.

    실제로 저도 ISAPI 모듈등을 작업할때 GetModuleFileName를 이용해서 작업을 했었거든요.

    2008.12.26 10:52 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • code guru의 소스를 이용해서 한번 해봐야겠어요.
      저도 GetCurrentDirectory()란걸 생각해보니 웬지 바뀔것 같아서 검색해보니 역시나 바뀔 우려가 있다라고 되어 있더라구요. 좋은 내용 감사합니다 ^^

      2008.12.26 10:59 신고 [ ADDR : EDIT/ DEL ]