2010년 07월 04일
가장 황당했던 코딩 실수
코딩은 늘 실수의 연속이죠. 오타가 대부분인데 99.99%는 컴파일 에러로 잡아낼 수 있지만 컴파일 에러가 안 나는 경우는 가끔 골치 아픕니다. 오늘 포스팅은 숨은 그림 찾기~
for(i=0;i<16;i++);
{
....
}
괄호 뒤에 세미콜론을 붙이는 경우가 많아서 무의식적으로 세미콜론을 붙이면 눈에 잘 안 보입니다. ... 부분도 반복만 안 될 뿐 한 번은 실행이 되니까요. ... 부분 안에 break라도 있으면 거의 그 곳만 쳐다보고 뭐가 잘못되었는지 계속 실행해보죠.
while( t != O )
{
....
}
이 경우도 정말 황당했던 것 같습니다. 숫자 0 바로 밑에 알파벳 O가 있죠? 전 이 경험을 한 뒤로 절대 변수 이름은 알파벳 O로 만들지 않습니다. 같은 실수로 i < I도 있습니다. 알파벳 I도 변수 이름으로 절대 안 씁니다.
if( file = NULL)
{
....
}
이건 다들 많이 해보는 실수죠. 그래서 if( NULL == file )로 쓰시는 분들도 있긴 한데 저는 아직도 그냥 if( file == NULL )로 쓰고 있습니다.
if((file = fopen( "text.txt", "r" ) < 0))
{
....
}
한 줄에 괄호가 많으면 일반적으로 하나씩 확인을 하는데 이 경우는 워낙 많이 짜본 줄이라 오히려 의심을 안 한 부분이죠.
if( p =! j )
{
....
}
왜 눈에 안 들어왔을까요... 알고 보면 참 간단한데...
정말 많은 실수를 했지만 그 중에도 가장 황당했던 실수는... 두둥~ 어떤 문제를 고민하다가 '소수 집합을 쓰면 더 효율적이지 않을까..'라는 생각에 prime.c를 줄줄이 짜고 첫 컴파일을 하는 순간!
$ gcc prime.c -o prime.c
$ ./prime
2 3 5 7 11 13 17 19 ...
아.. 하늘도 무심하시게 컴파일도 실행도 참 완벽하게 되더군요. 첫 컴파일 때는 당연히 컴파일 오류가 떠야 정상(?)인데... 그래서 prime.c를 처음부터 다시 만들었는데(다시 만들 때는 왜 컴파일 에러가 나냐고...) 소수 말고 원래 방법이 더 좋더군요. 아.. 역시 신은 없나 봅니다. 응?
덧. 이건 실수라기보다는 어릴 때 지식이 짧아서 생긴 문제였는데 이런 경우도 있었습니다.
float x, y;
...
if( x == y )
{
....
}
덧2. '글 올리기'를 누르고 나면 하나씩 더 생각이 나네요 ;; 이것도 실수라기보다는 어릴 때 지식이 짧아서 생긴 문제인데 float를 문자열로 변환을 하려고 함수를 찾는데 아무리 봐도 float을 문자열로 바꿔주는 함수는 없더군요. 그래서 꾸역꾸역 만들고 있는데... 깨닮음을 얻었습니다. '아... 이래서 sprintf가 있는 거구나...'
for(i=0;i<16;i++);
{
....
}
괄호 뒤에 세미콜론을 붙이는 경우가 많아서 무의식적으로 세미콜론을 붙이면 눈에 잘 안 보입니다. ... 부분도 반복만 안 될 뿐 한 번은 실행이 되니까요. ... 부분 안에 break라도 있으면 거의 그 곳만 쳐다보고 뭐가 잘못되었는지 계속 실행해보죠.
while( t != O )
{
....
}
이 경우도 정말 황당했던 것 같습니다. 숫자 0 바로 밑에 알파벳 O가 있죠? 전 이 경험을 한 뒤로 절대 변수 이름은 알파벳 O로 만들지 않습니다. 같은 실수로 i < I도 있습니다. 알파벳 I도 변수 이름으로 절대 안 씁니다.
if( file = NULL)
{
....
}
이건 다들 많이 해보는 실수죠. 그래서 if( NULL == file )로 쓰시는 분들도 있긴 한데 저는 아직도 그냥 if( file == NULL )로 쓰고 있습니다.
if((file = fopen( "text.txt", "r" ) < 0))
{
....
}
한 줄에 괄호가 많으면 일반적으로 하나씩 확인을 하는데 이 경우는 워낙 많이 짜본 줄이라 오히려 의심을 안 한 부분이죠.
if( p =! j )
{
....
}
왜 눈에 안 들어왔을까요... 알고 보면 참 간단한데...
정말 많은 실수를 했지만 그 중에도 가장 황당했던 실수는... 두둥~ 어떤 문제를 고민하다가 '소수 집합을 쓰면 더 효율적이지 않을까..'라는 생각에 prime.c를 줄줄이 짜고 첫 컴파일을 하는 순간!
$ gcc prime.c -o prime.c
$ ./prime
2 3 5 7 11 13 17 19 ...
아.. 하늘도 무심하시게 컴파일도 실행도 참 완벽하게 되더군요. 첫 컴파일 때는 당연히 컴파일 오류가 떠야 정상(?)인데... 그래서 prime.c를 처음부터 다시 만들었는데(다시 만들 때는 왜 컴파일 에러가 나냐고...) 소수 말고 원래 방법이 더 좋더군요. 아.. 역시 신은 없나 봅니다. 응?
덧. 이건 실수라기보다는 어릴 때 지식이 짧아서 생긴 문제였는데 이런 경우도 있었습니다.
float x, y;
...
if( x == y )
{
....
}
덧2. '글 올리기'를 누르고 나면 하나씩 더 생각이 나네요 ;; 이것도 실수라기보다는 어릴 때 지식이 짧아서 생긴 문제인데 float를 문자열로 변환을 하려고 함수를 찾는데 아무리 봐도 float을 문자열로 바꿔주는 함수는 없더군요. 그래서 꾸역꾸역 만들고 있는데... 깨닮음을 얻었습니다. '아... 이래서 sprintf가 있는 거구나...'
# by | 2010/07/04 11:29 | 기타 | 트랙백 | 덧글(14)
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
하지만 실전에서는 그리 쉽게 보이지 않을거라는거....
(나무를 숨기려면 숲에 숨기는..)
이래서 권장 코딩 스타일이 있는 거임.
뭐 그런 권장 없어도 코딩 좀 지겹게 했다 싶으면 손가락이 알아서 맞춰주던데...
제 기억에 for문 뒤에 세미콜론 붙이는 실수는 코딩 12년차 쯤에 했던 실수같군요.
12년 동안 안 하던 실수를 그 날은 왜 했는지 모르겠습니다.
C언어 처음 배울 때도 안 하던 실수를, 12년 동안 한 번도 안 해 본 실수를 하니, 눈에 진짜 안 보이더군요.
읽기만 해도 화가나는군요.
막 1시간 2시간 찾았는데 저런에러면 정말...
아머림ㄴ어래ㅑㅓㅁ대럼널먼라ㅣㅏㅇ러
헐...
사람마다 피하는 방법도 가지각색인듯합니다만, 역시나 권장 코딩 방식의 중요성이 이럴때 드러나나 봅니다. 그리고 실수 연산에서의 비교 구문은 정말 주의해야 하죠. 연산의 정확도가 중요한 프로그램에서는 복잡하고도 귀찮은 여러가지 트릭이 필요한 부분이기도 합니다.
뽀도르 // 전 컴퓨터를 못 쓰는 강의 때는 늘 노트에 손코딩을 하고 있었죠. 손테스팅을 한 뒤, 손디버깅... ;; 나중에 컴퓨터로 또 디버깅... ;;
RedPain // 악;;; 버그가 많이 생기는 방식이었군요. 뭔가 다른 해결책이 필요할지도 ㅠㅠ... 연산자 오버로딩이 오히려 더 문제인것 같아서, 컴파일 타임시에 구문 자체를 아예 대치시켜버리는 #define이 최선이라고 착각했었나봅니다. 사실 이건 원래 포트란에서 자주 쓰던 코딩방식이 굳어버리면서 쓰게된 저만의 방법이라 문제가 없다면 그게 더 이상하겠죠 ㅠㅠ..
다른 방법도 연구를 해봐야겠다는 생각이 RedPain님 말씀을 듣고 불현듯 들었습니다 ㅠㅠ...