이번에 책에 있는 Algorithm Psudocode를 C/C++/JAVA/Perl로 구현하는 재미있는 일을 했습니다.

그런데 JAVA에서 예상치도 못한 일들이 일어났다지요 -_-;;
JAVA에서 무슨 일이 났는지 컴파일을 하면 계속 에러를 냅니다 -_-;;
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at ex2.bin2(ex2.java:54)
at ex2.main(ex2.java:20)


이 에러는 배열의 Index에 -1을 참조했기 때문에 에러를 내면서 종료한다는 에러입니다.

C, C++, Perl에서도 비슷한 알고리즘을 썼는데 JAVA와 비교를 했죠.
C/C++의 경우

 41 int bin2(int n, int m)
42 {
43 int i, j;
44 int Bin2[n+1][m+1];
45 for(i = 0; i<= n; i++)
46 for(j = 0; j<= min(j, m);j++)
47 if(j == 0 || j == i)
48 Bin2[i][j] = 1;
49 else
50 Bin2[i][j] = (Bin2[i-1][j-1] + (2 * Bin2[i-1][j]));
51 return Bin2[n][m];
52 }


Perl의 경우

 24 sub bin2
25 {
26 my ($n, $m) = @_;
27 # Use array
28 my @B;
29 for(my $i = 0; $i <= $n; $i++)
30 {
31 for(my $j = 0; $j <= min($j, $m); $j++)
32 {
33 if($j == 0 || $j == $i)
34 {
35 $B[$i]->[$j] = 1;
36 }
37 else
38 {
39 $B[$i]->[$j] = $B[$i-1]->[$j-1] + (2 * $B[$i-1]->[$j]);
40 }
41 }
42 }
43 return $B[$n]->[$m];
44 }

JAVA의 경우

36     public static int bin2(int n, int m)
37 {
38 int [][]Bin2 = new int[n+1][m+1];
39 for(int i = 0; i<= n; i++)
40 for(int j = 0; j<= min(j, m);j++)
41 if(j == 0 || j == i)
42 Bin2[i][j] = 1;
43 else
44 Bin2[i][j] = (Bin2[i-1][j-1] + (2 * Bin2[i-1][j]));
45 return Bin2[n][m];
45 }


같은 알고리즘을 써서 컴파일을 했는데 C/C++/Perl에선 정상 값이 나오고 JAVA에서는 예외처리를 하니 참 어이가 없었죠.,
제 생각에 JAVA가 엄격한지 소스를 꼼꼼히 보았습니다.

i = 0일때 만약 j = 0이면 if(j == || j == i)라면 빠져나가야 합니다. 여기서는 문제 없는 듯 합니다.
i = 0일때 만약 j = 1이면 else구문을 실행하여 Bin2[0][1] = Bin2[-1][0] + (2 * Bin2[-1][0])을 실행해야 합니다.
그런데 min함수를 써서 return값이 작으면 for문이 j값을 증가시키지 않고 빠져나가게 합니다.

C/C++/Perl에서는 책에 있는 알고리즘을 그대로 써도 min값이 return되어서 상관 없는데 JAVA는 책에 있는 알고리즘이 잘못된 배열 참조한다는 것을 알아내서 예외처리를 하는 것을 보니 JAVA에서 for문 안에서 min함수 return값을 못알아 먹는 것 같아서 짜증이 나군요.

JAVA에서 이 알고리즘이 제대로 작동되지 않은 것 같아서 이런 꼼수를 썼습니다.

 36     public static int bin2(int n, int m)
37 {
38 int [][]Bin2 = new int[n+1][m+1];
39 for(int i = 0; i<= n; i++)
40 for(int j = 0; j<= min(j, m);j++)
41 if(j == 0 || j == i)
42 Bin2[i][j] = 1;
43 else if (i == 0)
44 break;
45 else
46 Bin2[i][j] = (Bin2[i-1][j-1] + (2 * Bin2[i-1][j]));
47 return Bin2[n][m];
48 }

i = 0일때 안의 for문을 무조건 빼지게 하였더니 C/C++/Perl과 같은 값이 나왔습니다.
이거 C/C++/Perl에서는 JAVA와 다르게 오류없이 돌아가는 것을 보니 왜그런 것일지 궁금하군요.

JAVA가 for문 안에서는 함수를 콜해서 return 값을 받아들이지 못하는 것 같아서 짜증이 나군요. C/C++/Perl에서는 아무런 문제가 없는데 말이죠.

컴퓨터프로그래밍 언어를 배우면 배울수록 궁금한것 투성인것 같네요,

'컴퓨터' 카테고리의 다른 글

Prolog 설치 및 평  (4) 2007.05.15
Pascal과제 기록  (3) 2007.04.14
[site] ANSI C Yacc grammar  (1) 2007.03.27
Perl  (2) 2007.03.17
이런 언어들을 익숙하게 쓸 수 있을까?  (6) 2007.03.10
Buy me a coffeeBuy me a coffee

+ Recent posts