Programming/C Win32 MFC2009. 5. 28. 21:49
일반적으로 사용하는 구조체 초기화 방법은 아래와 같다.
struct address {
                 int street_no;
                 char *street_name;
                 char *city;
                 char *prov;
                 char *postal_code;
               };

struct address temp_address =
               { 0,
                 "st. green",
                 "Hamilton",
                 "Ontario",
                 "123-456");

위의 방법은 C89 의 방법이고
C99에서는 아래와 같이 특정변수만 제한적으로 초기화가 가능하다.

struct address {
                 int street_no;
                 char *street_name;
                 char *city;
                 char *prov;
                 char *postal_code;
               };

struct address temp_address =
{ .city = "Hamilton", .prov = "Ontario" };


[링크 : http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic]
Posted by 구차니
Programming/C Win32 MFC2009. 5. 26. 23:23
libjpeg.a 라는 녀석을 발견하고는 어떻게 생겼나 궁금증이 생겼다.

$ ll libjpeg.a
-rw-r--r-- 1 root root 166012 2007-10-01 23:36 libjpeg.a

$ file libjpeg.a
libjpeg.a: current ar archive

$ nm -A libjpeg.a
libjpeg.a:jcapimin.o:00000330 T jpeg_CreateCompress
libjpeg.a:jcapimin.o:         U jpeg_abort
libjpeg.a:jcapistd.o:         U jinit_compress_master
libjpeg.a:jcapistd.o:000001b0 T jpeg_start_compress
libjpeg.a:jctrans.o:000000c0 t compress_output
libjpeg.a:jctrans.o:         U jinit_c_master_control
libjpeg.a:jcparam.o:000008a0 t add_huff_table
libjpeg.a:jcparam.o:000000e2 r bits_ac_chrominance.3846
... 파일별로 반복
'
U,T,r 등은 symbol type 이라고 하며,
위의 U는 Undefined 을, T는 Text section(code) 을 의미한다.



$ ar -t libjpeg.a
jcapimin.o
jcapistd.o
jctrans.o
jcparam.o
jdatadst.o
...


$ objdump -x libjpeg.a
In archive libjpeg.a:

jcapimin.o:     file format elf32-i386
rw-r--r-- 0/0   2296 Oct  1 23:36 2007 jcapimin.o
architecture: i386, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000

Sections:
SYMBOL TABLE:
RELOCATION RECORDS FOR [.text]:
... 파일별로 반복



mangling은 컴파일러에서 이름이 중복되지 않도록 독특한 이름을 지어주는 것으로
C++에서 overloading을 지원하기 하는데 사용되기도 한다고 한다. [링크 : http://rubyeye.kr/]

int _cdecl    f (int x) { return 0; }	//	_f
int _stdcall  g (int y) { return 0; }	//	_g@4
int _fastcall h (int z) { return 0; }	//	@h@4

위키피디아에서 참조한 녀석으로 MS 컴파일러가 C언어 맹글링하는 방식의 예제이다.
[링크 : http://en.wikipedia.org/wiki/Name_mangling]

그리고 이러한 녀석을 원래이름으로 돌려주는 유틸리티로 c++filt가 존재한다.
[참고 : http://kldp.org/node/68410]


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

indent style  (0) 2009.06.09
C99 구조체 초기화 하기  (0) 2009.05.28
신기한 코드 사이즈  (0) 2009.05.19
double형을 int 형으로 출력하면?  (0) 2009.05.15
전처리기를 이용한 디버깅용 선언문(#define)  (0) 2009.05.15
Posted by 구차니
Programming/C Win32 MFC2009. 5. 19. 10:50
8051에서는 for문으로 돌리면 용량이 팍팍 줄어드는데..
x86 intel visual studio 에서 컴파일 하면 용량이 차이가 전혀 나지 않는다

#include "stdio.h"

void main()
{
	int idx = 0;
	char temp = 0xAA;
#if 1
	for(idx = 0; idx < 8;idx ++)
		printf("%d\n",temp & (0x01 << idx));
#else
	printf("%d\n",temp & 0x01);
	printf("%d\n",temp & 0x02);
	printf("%d\n",temp & 0x04);
	printf("%d\n",temp & 0x08);
	printf("%d\n",temp & 0x10);
	printf("%d\n",temp & 0x20);
	printf("%d\n",temp & 0x40);
	printf("%d\n",temp & 0x80);
#endif
}

어찌된게.. for문으로 돌리던, 그냥 하던 4개를 주석처리하던 용량은 똑같은 40,960 바이트이다
자체 압축을 지원한다고 해도 한두바이트 정도는 차이가 나지 않을까 싶긴한데..
그게 아니라면 블럭단위로 저장을 해서 티가 안나는 것일려나.. (정확하게 40KB이다)

 



Posted by 구차니
Programming/C Win32 MFC2009. 5. 15. 19:37
cinfo.output_gamma [930841904] <- int 형으로 출력
cinfo.output_gamma [1.000000]   <- double 형으로 출력


libjpeg 사용하다 디버그 문장을 제대로 안골라서 발생한 오류 -ㅁ-
Posted by 구차니
Programming/C Win32 MFC2009. 5. 15. 19:21
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 구차니
Programming/C Win32 MFC2009. 4. 29. 12:06
글쓸 꺼리를 준 친구 녀석에게 감사를 ㅋㅋ

간단하게 설명을 하자면,
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 구차니
Programming/C Win32 MFC2009. 4. 22. 11:25
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 구차니
Programming/css2009. 4. 9. 10:06
Mr.Dust 님의 CSS Naked Day를 보고 따라해보려고 쑈를 했다 ^^;


일단 아무생각없이 HTML/CSS 에서 CSS를 전부 지우면 아래와 같은 에러가 나서 저장이 안된다.

그러면 아래의 내용을 넣으면 된다.


@charset "utf-8";
* {
}

'Programming > css' 카테고리의 다른 글

CSS / JS 파일 용량 줄이기  (0) 2015.09.18
css selector  (0) 2015.09.14
css 관련  (4) 2015.09.08
css box model  (0) 2014.05.15
크롬과 IE에서 CSS 차이점 - body / background-color  (2) 2011.03.09
Posted by 구차니
Programming/C Win32 MFC2009. 3. 24. 11:16
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 구차니
Programming/C Win32 MFC2009. 3. 16. 12:33
있을 줄 알았는데 없다는 사실에 웬지 "초~ 쇼크~"(하레와 구우 버전)


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()가 없다는 건 웬지 억울한 느낌?


Posted by 구차니