일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 간단한 앱만들어보기
- 저장소와 동적메모리
- 저조도
- 과초점거리
- camera
- Zoom Lense
- Digital Slow Shutter
- 고정비트레이트
- 실생활알고리즘
- Depth of Fileld
- C Mount
- 렌즈
- Patch Cleaner
- 무게선별자동화
- main 함수 인자 전달
- 조건 제어문
- c언어
- Pixel Bit Format
- 아이리스
- ASCCII
- Gain
- 카메라
- 변수의 초기화와 대입
- 변수
- 이미지센서
- image sensor
- 심도
- 프로그래머스 lv2
- AppInventer
- CS Mount
- Today
- Total
목록Langauge/C (28)
카메라 개발자 공부방(SW)
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b8ufJy/btrhdWhDxBy/Tnc165tVt5a3YpJswZALlK/img.jpg)
자 오늘은 재귀 함수에 대해 공부를 해보겠습니다. 재귀 함수란 아래와 같은 형태의 함수를 의미합니다. #include // 1 line // 2 int Print() // 3 { // 4 printf("Print\n"); // 5 Print(); // 6 } // 7 // 8 int main() // 9 { // 10 Print(); // 11 return 0; // 12 } // 13 // 실행결과 // runtime error eccured 자기 자신을 호출하는 함수를 재귀 함수라고 합니다. 위의 코드는 문제가 있는데 실제로 실행해보면 11라인에서 3~6라인 다시 3~6라인 무한히 호출이 됩니다. 함수가 완전히 수행해서 종료가 돼야 Stack 메모리에서 제거가 됩니다. 하지만 위 코드는 계속 콜 하니..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/TDiDA/btrhgjQrwBD/zf32t5rI4cap0rUOtFrkpk/img.jpg)
다음은 함수 포인터에 대해 공부해보겠습니다. 함수가 익숙하지 않으시다면 사용자 함수 부분을 꼭 복습해주세요. 다음 코드를 보시겠습니다. #include void Print() { printf("%p\n", Print); } void Add(int x, int y) { printf("%d+%d=%d\n", x, y, x + y); } int main() { printf("%p\n", Print); printf("%p\n", Add); printf("%p\n", main); return 0; } // 실행결과 // function address // function address // function address 함수의 이름은 그 함수의 시작 주소입니다. 함수의 이름도 포인터기 때문에 포인터 변수에 저장할..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bCJqdW/btrhezzfltq/DBDAHNSKlx3uWxvJOXPbvK/img.jpg)
오늘은 void*에 address type에 대해 공부를 해보겠습니다. address type이 void*란 의미는 어떠한 형식의 address type도 저장시킬 수 있다는 걸 의미합니다. (다시 말하면 int*, int**, char* 이든 모두 저장시킬 수 있다는 의미인데요.) 이것이 왜 필요할까요? malloc을 생각해봅시다. malloc()은 heap 영역에 메모리 공간을 할당하고 그 시작 주소를 반환하는데요. 이 반환 type 또한 void*입니다! (익숙하지 않으시다면 저장소와 동적 메모리 파트를 꼭 복습해주세요.) 메모리의 반환은 void* 이지만 프로그래머가 원하는 목적에 따라 메모리 type을 지정해서 사용할 수 있었습니다. 컴퓨터 입장에선 메모리를 할당 했지만 사용자가 어떠한 addr..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/deT7s8/btrg1GSGctu/CwhbJxdCZCZeiOvAFJZ7zk/img.jpg)
오늘은 2차원 배열에 대해 공부를 해보겠습니다. 배열과 포인터의 사용이 익숙하지 않으시다면 앞장의 배열과 포인터 부분을 꼭 복습해주세요! 우리는 앞서 배열은 앞서 많은 변수를 다루기 위한 메모리 공간이라 배웠습니다. 그때 배웠던 배열은 1차원 배열입니다. 그림으로만 봐도 할당된 메모리 공간을 메모리가 1차원으로 저장 관리되는 것을 알 수 있는데요! 2차원 배열은 차원이 2개인 배열이라 생각해주시면 됩니다. dataType arrayName[size][size]; 앞의 인덱스는 행을 의미하고, 그 뒤의 인덱스는 열을 의미합니다. 1차원 배열을 공부할 때, 배열의 이름은 첫 번째 요소의 주소다라고 배웠습니다. 그런데 2차원의 경우도 마찬가지지만 조금은 특이한데요. int arr[4][4] = {0}; arr..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bbRBnK/btrgQBkwaCU/si6XBR21wWAYLAZrklCKjK/img.jpg)
자 다음은 구조체에 대해 공부해볼 시간입니다. 우리는 앞장에서 data type과 변수에 대해 공부를 했었습니다. 그런데 코딩을 하다 보면 연관 있는 변수끼리 묶어서 관리하면 굉장히 편할 때가 있는데요. 이럴 때 구조체가 사용될 수 있습니다. 다음 코드를 보겠습니다. #include int main() { int x = 2 ; int y = 4; printf("%d, %d\n", x, y); return 0; } x와 y는 좌표를 의미하기 때문에 따로 사용될 때는 전혀 의미가 없는 값들입니다. 구조체를 사용하면 다음과 같이 선언할 수 있습니다. struct Point { int x; int y; }; #include struct Point { int x; int y; }; int main() { stru..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Ej5vA/btrgMtyYsOa/tZL7KUkxiINRdUc4WrjBKK/img.jpg)
자 오늘은 저장소에 관한 내용과 동적 메모리에 대해 이야기해보겠습니다. 프로그램은 적절한 명령을 통해 주어진 데이터로 가공해서 원하는 결과를 내는 것이 주 역할입니다~! 그런 의미에서 프로그램은 큰 범주에서 명령어와 데이터로 나눌 수 있습니다. 프로그램에 따라 데이터는 1) 잠깐만 필요한 경우가 있고, 2) 프로그램 전반에 메모리가 필요하거나 3) 프로그램이 종료되더라도 계속 살아있어야 되는 경우가 있습니다. 1) 메모리가 잠깐만 필요한 경우 - 연산 과정 중에 나오는 결과를 저장해야 되는 경우 2) 프로그램 전반에 메모리가 필요한 경우 - 메모리가 계속 살아있어야지만 application을 운용할 수 있는 경우 3) 프로그램이 종료되더라도 살아있어야 되는 메모리인 경우 - 파일에 저장된 데이터 - Da..