Static 변수는 변수 선언 시 앞에 static을 추가하여 선언하여 사용하며, 다음과 같은 특징이 있습니다.

 

  1. 선언 위치는 지역변수와 같을 수 있다.
  2. 특정 선언 지역에서만 접근 할 수 있다.
  3. 메모리 저장공간에서 변수의 저장 공간은 전역변수와 그 위치가 같다.
  4. 초기값을 주지 않을 경우 항상 0으로 초기화 되며, 프로그램을 실행 시킬 때 단 한 번만 초기화 된다.

 

아래와 같은 코드가 있다고 가정하면서 위의 static의 특징을 살펴보겠습니다.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

void call();

   

int main()

{

    call();

    call();

    call();

    return 0;

}

   

void call(void)

{

    static int count = 0;

    count ++;

    printf("%d ", count);

}

cs

 

 

위의 call함수에서 static int count라는 변수가 선언되었습니다. 4번에 의하면 초기화는 딱 한 번만 하므로, main문에서 3번 call이 호출되었다고, 매번 count가 0으로 초기화 되지는 않습니다. 이 점을 주의해야 합니다.

 

또한, 2번의 특징처럼 count라는 변수는 선언이 된 call함수에서만 사용이 가능하며, 다른 위치에서는 사용을 할 수 없습니다. 만약 다른 함수에서 사용하고 싶다면, global변수처럼 main문 밖에서 선언하게 되면, main에서도 call에서도 사용이 가능합니다. 그래서 선언 위치는 자유롭지만, 그에 따른 제약에 주의가 필요합니다.

 

3번의 설명처럼 전역변수와 변수의 저장 공간이 같습니다.

 

 

이러한 특징을 토대로 결과 값은

1 2 3 이 나오게 됩니다.

 

만약 call에서 static int count 대신…. int count로 일반 변수로 선언되었다면, (static이 아니라)

값은 1 1 1 이 됩니다.

 

이러한 static의 특징 때문에 저의 경우는 static으로 선언 한 것은 어떤 동작의 count를 하는 목적으로 사용하고 있습니다. 예를 들면 특정 동작이 몇번 반복되었는지를 기록하여, 그에 따른 처리를 할 때 static int count라는 변수를 만들어 그 동작을 기록하도록 합니다.

   

  

Posted by 고무함지
,


포인터 연산자의 경우 다른 연산자와 같이 사용되면, 정말 이해하기 힘들어집니다.

저도 이런 상황에서 항상 잘못 이해해서 오류를 만들곤 했습니다.

 

아래의 예는 사실 이렇게 혼란스럽게 사용하면 안 되지만, 일부로 공부를 위해 극단적인 예를

들어서 설명하려 합니다.

 

1

2

3

4

5

6

7

8

9

int array[5={1020304050};

int * p = array + 3;  // array의 3번째 항목의 주소를 대입. 즉 {40, 50}

   

++*p++;

   

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

   

// 과연 다음의 값은 어떻게 될까요?

   

Colored by Color Scripter

cs

 

 

여기서 프린트 되는 값은 "50" 입니다.

 

이유를 설명하기 전에, 연산자 우선 순위에 대해 알고 있어야 합니다.

아래의 연산자 우선 순위(c언어 기준) 를 보면, '++(후위증가)' 연산자가 2 순위이며,

'++(전위증가)'와 '*' 우회(역참조)연산자가3순위입니다.

즉 2 순위를 먼저 해석해야 하며, 2 순위의 경우 … 결합 법칙상 왼쪽먼저

해석을 진행합니다. 그러나 p의 왼쪽엔 후위증가 연산자가 없으므로,

P의 오른쪽의 후위증가 연산자를 해석합니다.

그러면, ++*p++ 을 해석의 순서대로 나눠 보면…

 

++*p++ // 1. ++ 후위 증가를 한다.

++*p++ // 2. p++라는 값이 후위 증가가 된다. p는 {40, 50}을 가르키는 포인터이므로,

포인터 값이 증가된다면, { 50 } 을 가리키게 됩니다. 다만…. 후위 증가이므로, 현재라인에서는

변화가 없고, 아래 print문에서 변경사항이 적용됩니다.

 

// 3. 이제 나머지 3순위 연산자를 해석해봅니다. 3순위의 경우 오른쪽에서 왼쪽으로 해석합니다.

++*p++ // 3. *p …p가 가르키는 값이므로, { 40 }이 됩니다. 이 값을 ++ 전위 증가를 합니다.

그러면, 40은 1이 증가됩니다. (포인터의 주소값이 증가되는 것이 아니라, 그 값이… 증가됨)

그러므로, 41이 됩니다.

 

코드에 주석으로 각 라인마다 결과를 보면 아래와 같게 됩니다.

1

2

3

4

5

6

7

int array[5={1020304050};

int * p = array + 3;  // array의 3번째 항목의 주소를 대입. 즉 {40, 50}

   

++*p++;   // p는 {41, 50} 

   

printf("%d \n"*p);  // p는 { 50 } , array[5]는 { 10, 20, 30, 41, 50} 

   

Colored by Color Scripter

cs

 

역시나 그래도 어렵고 복잡하긴 한데,

연산자 우선 순위를 이해하는 것을 공부하기에 좋은 문제 인 듯합니다. ^^

 

< 출처 : wiki https://ko.wikipedia.org/wiki/C%EC%99%80_C%2B%2B%EC%97%90%EC%84%9C%EC%9D%98_%EC%97%B0%EC%82%B0%EC%9E%90 >

Posted by 고무함지
,


Dell U2311H 23 인치 LCD모니터의 공장 메뉴 진입 방법을 소개합니다.


델 모니터 마다 각각 조금씩 다르더군요.


U2311H모델의 경우엔 아래 사진 처럼 키가 5개 있습니다.



< 사진상 가장 윗쪽의 버튼을 1번... 2번... 3번... 4번 ... 전원키 순서로 있습니다.>



1) 맨아래 파워 버튼을 눌러 일단 모니터를 끕니다.


2) 1번 2번 버튼을 동시에 누르고 나서... 파워 버튼을 누르면, 모니터가 다시 켜집니다.


3) 이후 모니터가 켜졋으면, 1번 버튼을 누르면.... 모니터 왼쪽 윗 부분에 파란색 메뉴가 나옵니다.

-> 이것이 공장 메뉴입니다.


4) 공장 메뉴에서는 되도록 모니터 버튼을 조작하지 말고... 

그냥 다시 파워 버튼을 눌러 껐다가... 다시 켜시길 권합니다.


설정이 함부로 바뀌는 실수가 나올 수 있기 때문입니다.



마지막으로...) 뭐 모니터의 공장 메뉴를 봐서 딱히 할 일은 없다지만...

숨은 기능을 찾아서 확인해보는 재미가 있어서, 저도 해봤네요. 


이 방법은 Overclockers 포럼 글을 참고했습니다. :http://forums.overclockers.co.uk/showthread.php?p=17855060




< 제가 사용하는 모니터는 3021 시간을 사용하고 있습니다. >

< 그외 각 color preset mode마다의 Red, Green, Blue Gain 수치가 보입니다. >




Posted by 고무함지
,


얼마 전 x-rite사의 i1 Display 3 : 컬러 측정센서를 마련해서...


집에 있는 Dell U2311H 모니터의 컬러 및 gamma 커브 조정과.... ICC profile 생성 작업을 하였습니다.



준비물 


1. 먼저 x-rite 홈페이지에서 i1 Display 3의 드라이버를 받아 설치했습니다. 

[ x-rite i1 profiler ] 를 설치하면 드라이버가 같이 설치됩니다.


2. 두번째 [ DisplayCAL3 소프트웨어 ] 를 설치합니다. 이걸 설치하니 자동으로

중간에 [ Argyll CMS 소프트웨어 ]도 자동으로 같이 설치를 지원해주세요. 



제가 사용하는 버전은 아래 사진과 같습니다. 







3. i1 Display 3 센서를 PC의 USB포트에 연결합니다. 

4. 이제 DisplayCAL3를 실행합니다. 그전에... 모니터는 30분에서 1시간정도 워밍업을 해두는 것이 좋습니다. 

저는 sRGB 2.2 gamma, 6500k 로 교정하기로 했습니다.



5. 교정이 되기까지 이래저래 시간이 한시간 남짓 걸린 것 같네요. 

교정 초반에는 White point 의 color temperature (백색점의 색온도)를 교정하기 위해 모니터의 OSD메뉴를 이용해서, Red, Green,Blue의 Gain값을 직접
조정해야합니다. 이후 모니터의 밝기를 교정하기 위해 다시 OSD를 통해 backlight의 밝기값을 조정합니다. 조정의 기준은 DisplayCAL 프로그램에서
알려주는 막대 그래프를 보며 목표 값에 맞도록 정해줍니다. 

교정 후와 교정전... 우선 white point를 6500으로 맞추니... 차가웠던 색이 약간은 warm쪽으로 움직였구요.
Gamma의 경우엔.... 256 gray scale 페턴으로 보니... 기존에 어두운 쪽의 Gamma 커브가 급격히 아래 쪽에 있어서,
즉 갑자기 어두워지는데, 교정이후엔 전체적으로 Gamma 커브가 균등하게 적용된 것 같습니다. (눈으로 본 것이라 정확치는 않지만...)


마무리... 사실 제가 사진 작업이나, 정밀한 작업을 집에서 하지를 않아서, 모니터 교정이 그리 필요하진 않았는데요.
그래도 좀 더 표준에 맞도록 사용하는 것 같아 [만족감]은 있네요.

모니터의 공장 메뉴를 들어가보니... 모니터 사용 시간이... 대략 3000시간이 넘었네요. 
오래 쓸 수록 컬러나 기타 액정의 특성이 변화되므로 기회가 된다면(비싼 장비지만...) 
권장합니다. 물론.... 센서하나가 모니터 하나가격보다 비쌉니다. ... ㅜㅜ






< 아래는 백색점의 색온도를 맞추기 위해 OSD를 통해서 Red, Green, Blue의 Gain값을 제가 바꿔가는 모습을 아이폰을 촬영하였습니다. >



< 교정 과정을 반디 캠으로 캡춰 했습니다. 시간이 오래 걸려 중간 중간 편집한 화면입니다. : 아래 영상은 10분 정도 분량임 >












Posted by 고무함지
,

자주 사용하고 있는 git명령어를 모아봤습니다.


저는 svn을 사용했었는데, 처음 git을 쓸 때는 잘 이해도 안되고, 자주 사용중 실수로 인한

error가 많이 생겼습니다.


그래서 첫 인상은 별로 였는데, 주변 동료들의 경우 잘 사용하는 것을 보면서, 

저도 익숙해지도록 공부하고 있는 중인데, 이제는 ... 어느정도 익숙해졌고, 

그 덕분에 업무중 잘 사용하고 있습니다.


어느정도 공부해보니... git의 개념을 이해하지 않고 단순히... 명령어 만 사용하는

것에는 한계가 있다는 걸 알게 되었네요.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
 
1. Git 로그 검색하기
 
git log --name-only  ( 추천 ) // git log 보다는 변뎡된 파일 명도 같이 나오는 이걸 사용
git log --grep=검색어 ( 추천 )  // 검색어가 있는 내용만 검색
git log -p  -2          ( 추천 ) // 가장 최근 두개의 결과만 보여줌, 코드 변경사항도 같이 보여줌 
git log --oneline                 // 커밋의 제목만 볼 경우
 -> git log --oneline | grep PWM // pwm 관련 내용만 볼 경우
 -> git log --oneline | grep ---color=auto PWM  // 좀더 보기 편하게( -i 대소문자 구분없이 검색)
 
git log -p ./os/common_linux/dil/dil_pwm.c   특정 파일의 변경 이력만 볼 수 있다. (경로까지 알려줘야함)
 
git log // 일반적인 변경사항, 변경자 
git log --1   --word-diff  // 변경점을 줄단위가 아닌, 단어 단위로 보여줌
-> git log -p 커밋번호 -1  // 그 커멋 번호에 해당 되는 코드 변경 내용+커밋메시지 보기
---> git log --oneline 명령으로 찾은 후 커밋 번호만 복사해서 사용하면 편리하다.
 
git log --pretty=short  (간편히 볼때 추천)   // oneline : 한줄씩, short, full, fuller 옵션도 있음
git log --pretty=format:"%h %s" --graph ( 간편히 볼때 추천 ) // 부모 tree내용도 봄(--graph)
//... git log상태에서 /검색어 치고.... 단어 검색 대문자 N 은 윗 방향으로 검색, 소문자 n은 아래 방향으로 검색
 
<  Git show >
git show commit_id   // 그 커밋의 상세 변경점을 볼 수 있음. 
git show HEAD    // 가장 마지막 변경점 보기
git show HEAD^    // 전전 변경점 보기
git show HEAD~2    // HEAD로부터 2단계 위의 변경점 보기
 
 
 
2. 변경사항 Diff
git diff HEAD^ HEAD   ( 추천 )  // 현재의 내용과 바로전 내용(HEAD^) 비교함
git diff HEAD^^ HEAD            // 현재의 내용과 전전 내용(HEAD^^) 비교함 
git diff HEAD^ HEAD > diff_0518.patch  // 변경사항을 patch파일로 저장함.
git diff 커밋번호_B  커밋번호_A  // 번호별 차이도 볼 수 있음
 --> git log --oneline 으로 간략히 보고... 커밋번호 복사해서 위 명령어 사용
 
< 브렌치별 차이도 볼 수 있다>
git diff A_브랜치 B_브랜치
git diff --stat  // 간단히 어떤 파일들이 변경되었는지 세부 내용 보지 않고 통계치로만 보기
 
 
3. Git untracked file 보지 않기... git untracked files not showing
git status // 하면 변경파일과, untracked files 까지 보여짐
git status -uno // modified files만 볼 수 있다.
git status --untracked-files=no  // 다음도 modified files 만 보여준다.
git config status.showUntrackedFiles no // 또는 항상 안보고 싶다면, ... 설정을 변경한다.
git config status.showUntrackedFiles  
// 입력후 enter 키 누르지 말고, tab키를 누르면, untracked파일 리스트가 보인다.
 
 
4. commit-templates.txt 
이 파일은 commit할 때 문서 양식이다. 필요에 따라 내용을 변경할 수 있다.
vi .git/commit-templates.txt  
 
 
5. gitignore 파일로 변경점 관리 안 할(무시할) 파일 등록
 
//작업중인 최상위 폴더에서... 생성한다. 그래야 효력이 그 아래 폴더까지 해당됨
vi .gitignore  // 최상이 폴더에 파일 만들어 둔다.
.....................<.gitignore 본문>...............
// 이 폴더 내용 전체 무시  , '#' 문자는 주석을 넣을 때 앞에 사용
build/
// xxx.patch 파일 들 모두 무시      
*.patch    
.....................................................
 
 
6. git 작업브렌치 만들고, 이후 본브랜치에 merge하기
 
git branch // 현재 브렌치 확인 (만약 본 브렌치이면, 신규 bug_fix용 브랜치하나 생성)
 
git branch bug_fix_0519 // 신규 브랜치 생성
git checkout bug_fix_0519 // 신규 브랜치로 이동
// 위의 두가지를 한번에 하려면   
// git checkout -b bug_fix_0519 
 
// 여기서 코드 수정 작업하고, 변경 코드 저장한 후
git add 작업파일1 작업파일2 // 작업파일 add
git commit // 작업한 파일들 bug_fix_0519 브랜치에 올린다.
// git commit -"작업내용설명"  
// 이렇게 직접 수정 내용을 바로 적어도 되지만, 자세히 적기 위해
// git commit으로 하고 vi에디터를 통해 내용을 상세히 적는다.
git log   // 신규 내용 commit 잘 되었는지 확인
 
// 이후 이 개선사항을 본 브랜치에 넣고 싶으면
git checkout 본_브랜치명 // 본 브렌치로 이동(master가 될 수 도 있고, 프로잭트명일 수도 있고) 
git merge bug_fix_0519 // 아까 작업한 bug_fix_0519 브랜치 내용을 합친
 
// 만약 코드에 들어간 whitespace로 인해서 merge 잘 안된다면, whitespace 무시옵션사용
git merge -Xignore-space-change bug_fix_0519
 
// conflict 발생하면, 직접 git status 로 어떤 파일 문제인지 확인후, 수작업으로 고친다.
// 이후 다시 commit한다.
 
git merge --abort  // 이래저래 머지하다 문제 되면, 방금 merge한 것을 취소할 수 있다.
 
git log // bug_fix_0519 에서 작업한 것이 log에 들어왔는지 재 확인
git push review // 본브렌치의 원격 저장소에 코드 push 작업
 
// gerrit 사이트에서 push내용 잘 들어갔는지 확인 및, 동료에게 리뷰 요청 
git push review 목적지
 
그리고 전에 작업하던 브렌치는 지워버린다...
git branch -d bug_fix_0519 // 브랜치 지우기
 
 
8. git reset 
git reset HEAD~1   // 마지막 커밋 바로전으로 이동하기 
 
9. git tag  // 별명 붙이기
git tag v2.5 commit_id  // v2.5 라고 별명 붙이기
 
< git tag + git log >
git log v2.5..v2.6   // version 2.5와 2.6 사이의 commit들 보기
 
 
10. 패치 생성 및 적용하기
 
// 새로운 분기 생성
git branch mybugfix
 
// 새 브랜치로 이동
git checkout mybugfix
 
// 수정 작업 진행 후, git add , git commit을 진행하고 
 
// 수정한 패치를  생성한다.
git format-patch 메인브랜치명  // 메인 브랜치 명...
// 그러면 mybugfix 브랜치에서 수정하여, commit한 내용들이 나온다.
// LED버그 수정, sound버그 수정, video버그 수정등
// 3번의 commit작업이 있었다면, 번호-커밋제목.patch형식으로 파일이 자동생성됨.
 
0001-LEDbugFix.patch 
0002-SoundbugFix.patch 
0003-VideobugFix.patch 
 
// 이 작업은 중요한데,... 작업 브랜치에서 작업한 내용이 있고, 이후 메인 브렌치로 이동하면
그 내용이 잠시 안보이게 되는데(사실은 있지만)...
혹시라도 작업 브랜치를 실수로 지운다면.... 그 기록이 사라지므로. 이렇게 patch 파일로 
보관하는 것이 이중 안전 장치가 될 것 같다. 
 
// 이제 메인 브렌치로 이동한다. 
// 메인브렌치는 다같이 참여해서 개발하는 프로잭트 브랜치를 말한다.
git checkout 메인브렌치
 
// 이제 내 mybugfix브랜치에서 수정했던 내용이 있는 패치를 메인브렌치에 적용한다.
git apply 0001-LEDbugFix.patch
 
// 이제 patch로 수정을 적용하면, 이제 메인브렌치에서 add, commit을 하여,
// 다른 동료들도 적용된 내용을 볼 수 있게 한다.
 
cs



아래는 제가 공부하기 위해 많이 방문한 사이트 모음입니다.


참고 사이트 : 


1) 가상의 환경에서 git 체험해보기 : 실습을 웹상에서 할 수 있습니다.

http://learngitbranching.js.org/


2) git-scm.com 의 한글화된 git가이드 : 

https://git-scm.com/book/ko/v1/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0


3) git - 간편 안내서 : 

http://rogerdudler.github.io/git-guide/index.ko.html



Posted by 고무함지
,