misc.log2009. 6. 23. 01:18
Posted by uhm
dev.log2009. 6. 2. 17:21
누구나 이와같은 실수를 할 수 있다. 이런 실수의 근원은 루프의 현재 값과 루프 카운터가 일치하지 않는다는 점. 이를테면, 현재 값을 배열로 dataset[i] 등으로 루프카운터를 직접 사용했다면 문제의 소지가 전혀 없었을 것이다. 하지만 루프카운터와 현재 값이 따로 변함으로써 버그가 된 케이스. 따라서 루프를 돌면 현재 값이 직접적으로 변하도록 루프를 구성하는 것이 버그를 미연에 방지할 수 있다.
for ( LIST* cur = header; cur != 0; cur = cur->next )
{
     some_function( *cur );
     // .........................
}

만약 현재 인덱스가 필요하다면 별도의 카운터를 두는 것이 안전.
int index = 0;
for ( LIST* cur = header; cur != 0; cur = cur->next, ++index )
{
     some_function( *cur );
     // .........................
}

사실 거의 모든 C/C++ 학습서가 for 루프의 루프카운터를 정수형 변수로 쓰는 예제들만 소개하고 있기 때문에 위와 같은 형태는 초심자에게는 익숙하지 않을 수도 있다. 하지만 루프 카운터는 어떠한 타입의 변수라도 상관이 없으므로, 루프의 불변값과 종료조건을 대표할 수 있는 것으로 정하는 것이 바람직하다.

위와 같은 일반적인 루프카운터의 개념을 캡슐화한 것이 이터레이터(iterator)라는 추상개념. C++ STL의 근간이 되는 개념이다. (이터레이터는 개념이라, C++0x에서는 iterator가 concept 로 선언된다.)
for( list::iterator cur = data.begin(); cur != data.end(); ++cur )
{
     some_function( *cur );
     // ...............
}

중요한 것은, 루프의 현재 값과 종료조건을 언어의 문법적 레벨에서 결합시켜 놔야 안전한 루프가 된다는 점.

Posted by uhm
misc.log2009. 5. 28. 21:16
강가에서 - 이문세

그 마음들이 모여 흐른다면 푸르른 강물위로

흐르는 새 하얀 구름이 비출까?

검푸른 강물 위 날으는 새들도

우리의 세상도 머물 곳이 없어

우리가 찾아온 인생의 꿈들도

검은 저 강물에 매 말라 버리지

그러나 우리가 맑은 마음을 모아

저 강물에 다시 흐르게 해

부서지는 흰 물결을 두 손에 가득 담아

사랑하는 그대에게 드리게

지난날 푸르던 한강이 보고싶어

기억 속에 잠긴 그 모습을

할머니의 말씀같이 불어오는 바람에

이제는 후회 다시 하지 않도록

-----------------------------------------------------------------------------------
고 노무현 전 대통령님의 분향소 앞에서 기다리는 시간동안 내 머릿속을 맴돌던 노래.

Posted by uhm