목록프로그래밍 (6)
이쁜왕자 만쉐~~
* * * * * * * * * * * * * * * 위와 같은 출력 결과를 내는 프로그램을 작성하시오 라는 문제가 있다. 아래 예시는 C 언어로 작성했지만, 프로그래밍 언어와는 딱히 상관이 없다. 프로그래머 A - 초보(?) 프로그래머 B - 고수(?) 인터넷에 코딩 초보와 고수라는 짤이 돌아 다닌다. 해당 게시물에서는 왼쪽이 초보, 오른쪽이 고수 라고 나온다. 정말 그러할까? 만약 정말 요구사항이 처음 나온 그대로에서 바뀌지 않는다는 100% 확신이 있다면 오른쪽 형태로 코딩해도 상관 없고, 그것이 고수 맞다. 하지만, 현실을 그렇지 않다. 현실에서 코딩은 요구사항이 계속 바뀐다. 몇가지 간단한 예제를 들어 보자. 1. 문제를 5줄이 아니라 10줄로 출력해 보자. 왼쪽은 루프 안에 5 를 10으로 바..
"Hello World without Semicolon" 이라고, hello world 를 출력하는 C 프로그램을 작성하는데, 세미콜론(;) 을 사용하지 말고 작성하라는 문제가 있습니다. 일단 C 표준을 완전히 따르면서, 컴파일 워닝조차 없는 답은 아직 없는 것 같습니다. 일단 C 표준에서는 int main() 을 사용하도록 되어 있기 때문에, 반드시 return 0; 가 필요하고, 여기에서 세미콜론이 사용됩니다. 다만, return 을 생략하더라도 컴파일러가 이정도는 워닝만 출력하고 알아서 처리해주기 떄문에, 약간의 융통성을 발휘할 수 있습니다. 아니면 표준을 어기고 void main() 을 쓰는 방법도 있습니다. 어느 것을 선택하든 워닝은 발생합니다. 문제의 핵심은 printf("hello world..
C 언어에서 % 는 모듈로 연산이며,, 일반적으로 자연수 나눗셈의 나머지 값을 구하는 목적으로 사용된다.. 문제는 이게 음수에 적용되면 아주 골때린 문제를 야기한다.. int a = 12; printf ("a = %d , a/10 = %d , a%10 = %d\n", a, a/10, a%10); 위와 같은 코드가 있다고 하자.. 이는 별 문제 없이.. 다음과 같은 결과를 낸다.. a = 12, a/10 = 1, a%10 = 2 만약 a = 12 가 아니라 음수인 -12 이면 어떤 출력을 내는지 추측해 보자.. 결과는 다음과 같다.. int a = -12; printf ("a = %d , a/10 = %d , a%10 = %d\n", a, a/10, a%10); a = -12 , a/10 = -1 , a%..
내가 다루는 네트웍 장비에는 OS 이미지 파일 저장을 위해서 8 MB 크기의 플래쉬 메모리가 달려 있다.. 그중 1MB 는 부트로더와 환경변수 저장을 위해서 사용된다.. 남은 7MB 중 JFFS 가 1MB 가 조금 안되게 사용한다.. 그래서 6MB 가 남는다.. 여기에 백업용 OS 이미지 까지 2개의 OS 이미지가 들어가야 하므로,, OS 이미지 1개당 대략 3MB 만큼의 여유가 있다.. 이 장비를 처음 만들때는 3MB 는 충분한 공간이었다.. 실제로 초기 OS 이미지는 2.5MB 가 안되었다.. 하지만,, 시간이 지나면 지날수록 새로운 기능을 요구하는 ISP 의 요구에 따라,, OS 이미지는 시간이 지날수록 슬금슬금 커지기 시작한다.. 어느샌가 3.0MB 를 넘어 가 버렸다.. 확인해 본 결과,, OS..
파일로 부터 정보를 읽은 뒤,, 이를 가공해서 출력해 주는 루틴이 있다.. 그런데,, 장비가 부팅된 뒤 처음 이 정보를 읽으면 정상적으로 정보가 읽히지 않는다.. 첫번째 읽을때는 안되지만,, 두번째 부터는 언제 그랬냐는 듯 제대로 정보가 출력된다.. 아무리 디버깅 해봐도,, 도대체 이유를 알 수가 없다.. 별수 있나?? 이럴때 필요한 게 Plan B 이다.. 장비가 부팅된 뒤 무조건 한번 읽는 루틴을 추가 했다.. 하지만,, 이 방법은 실패 했다.. 추정컨데,, 장비가 부팅된 뒤,, 어느정도 시간이 흐른뒤 정보를 읽어야 하는듯 싶다.. Plan B 에 디버깅 따위는 없다.. 그래서,, Plan C 를 적용했다.. 사용자 명령에 의해서 읽을때,, 파일로 부터 정보 읽는 걸 2번 반복하도록 수정했다.. 다행..
매 5초마다 통계값을 읽은 뒤, 이 값을 5로 나눠서, 초당 평균값으로 사용한다.. Timer thread 는 비교적 정확히 5초마다 event 를 발생시켜 준다.. 하지만,, 느려터진 CPU 는 다른 프로세스에게 발목 잡혀 한참 뒤에서 통계 처리를 수행한다.. 이 덕분에 초당 평균값을 실제값보다 높게 나온다.. 처음에야 근사값만 필요했으니, 이정도 오차는 눈감아 줄만했다.. 그런데, 비교적 정확한 평균값을 내달라는 요구사항이 들어 왔다.. 정석적으로 해결을 하고자 한다면,, 통계값을 읽는 순간의 시간 정보를 읽어서,, millisecond 레벨에서 값을 보정하면,, 충분히 정확한 평균값이 나온다.. 불행히도,, 이렇게 바꾸기에는 너무 많은 걸 수정해야 한다.. 결국,, CPU 가 다른 프로세스에 의해서..