Error in pascalabc.net: Runtime error: The index was outside the bounds of the array

The error lies in these two lines(the full code is shown below)

exptab[i]:= (45 * exptab[i-1]) mod 257;  
logtab[exptab[i]]:= i;  

I understand that pascalabc represents how exptab[i] will be equal to 256 and throws an error beforehand.Online compilers do not see the error and the program works correctly. I can't change the conditions themselves, because the program encodes a certain cipher with certain conditions. Explain what might be wrong, because I won't be able to show the program running without running pascalabc(if it turns out to be the problem of the compiler, then I will try to negotiate with the teacher).

program SAFERK64;   
VAR a1, a2, a3, a4, a5, a6, a7, a8, b1, b2, b3, b4, b5, b6, b7, b8, r: byte;  
k: ARRAY[1..21,1..8] OF byte; k1: ARRAY[1..8] OF byte;  
logtab, exptab: ARRAY[0..255] OF integer; i, j, flag: integer;  
PROCEDURE mat1(VAR a1, a2, b1, b2: byte);  
BEGIN b2:= a1 + a2; b1:= b2 + a1; END;  
PROCEDURE invmat1(VAR a1, a2, b1, b2: byte);  
BEGIN b1:= a1 - a2; b2:= -b1 + a2; END;  
BEGIN  
logtab[1]:= 0; exptab[0]:= 1;  
FOR i:= 1 TO 255 DO  
BEGIN  
exptab[i]:= (45 * exptab[i-1]) mod 257;  
logtab[exptab[i]]:= i;  
END;  
exptab[128]:= 0; logtab[0]:= 128; exptab[0]:= 1;  
flag:= 0; writeln;  
writeln('Введите число раундов r (max 10)'); readln(r);  
writeln; writeln('Введите исходный текст из 8 байт с пробелами между ними');  
REPEAT  
BEGIN  
writeln('(Значение байта от 0 до 255)');  
readln(a1, a2, a3, a4, a5, a6, a7, a8);  
writeln('Введите ключ из 8 байт');  
readln(k[1,1],k[1,2],k[1,3],k[1,4],k[1,5],k[1,6],k[1,7],k[1,8]);  
k1 [1]:= k[1,1]; k1[2]:= k[1,2]; k1[3]:= k[1,3]; k1[4]:= k[1,4];  
k1 [5]:= k[1,5]; k1[6]:= k[1,6]; k1[7]:= k[1,7]; k1[8]:= k[1,8];  
writeln('ИСХОДНЫЙ ТЕКСТ ', a1:8,a2:4,a3:4,a4:4,a5:4,a6:4,a7:4,a8:4);  
writeln('КЛЮЧ ', k[1,1]:8,k[1,2]:4,k[1,3]:4,k[1,4]:4,  
k[ 1,5]:4,k[ 1,6]:4,k[ 1,7] :4,k[ 1,8] :4);  
FOR i:= 2 TO 2*r + 1 DO  
FOR j:= 1 TO 8 DO  
BEGIN  
k1[j]:= (k1[j] shl 3) + (k1[j] shr 5);  
k[i,j]:= k1[j] + exptab[exptab[9*i+j]];  
END;  
FOR i:= 1 TO r DO  
BEGIN   
a1:= a1 xor k[2*i-1,1]; a2:= a2 + k[2*i-1,2];  
a3:= a3 + k[2*i-1,3]; a4:= a4 xor k[2*i-1,4];  
a5:= a5 xor k[2*i-1,5]; a6:= a6 + k[2*i-1,6];  
a7:= a7 + k[2*i-1,7]; a8:= a8 xor k[2*i-1,8];  
b1:= exptab[a1]; b2:= logtab[a2]; b3:= logtab[a3]; b4:= exptab[a4];  
b5:=exptab[a5]; b6:= logtab[a6]; b7:= logtab[a7]; b8:= exptab[a8];  
b1:= b1 + k[2*i,1]; b2:= b2 xor k[2*i,2];  
b3:= b3 xor k[2*i,3]; b4:= b4 + k[2*i,4];  
b5:= b5 + k[2*i,5]; b6:= b6 xor k[2*i,6];  
b7:= b7 xor k[2*i,7]; b8:= b8 + k[2*i,8];  
mat1(b1, b2, a1, a2); mat1(b3, b4, a3, a4);  
mat1(b5, b6, a5, a6); mat1(b7, b8, a7, a8);  
mat1(a1, a3, b1, b2); mat1(a5, a7, b3, b4);  
mat1(a2, a4, b5, b6); mat1(a6, a8, b7, b8);  
mat1(b1, b3, a1, a2); mat1(b5, b7, a3, a4);  
mat1(b2, b4, a5, a6); mat1(b6, b8, a7, a8);  
writeln('После раунда',i:2,a1:8,a2:4,a3:4,a4:4,a5:4,a6:4,a7:4,a8:4);  
END;  
a1:= a1 xor k[2*r+1,1]; a2:= a2 + k[2*r+1,2];  
a3:= a3 + k[2*r+1,3]; a4:= a4 xor k[2*r+1,4];  
a5:= a5 xor k[2*r+1,5]; a6:= a6 + k[2*r+1,6];  
a7:= a7 + k[2*r+1,7]; a8:= a8 xor k[2*r+1,8];  
writeln('КРИПТОГРАММА',a1:8,a2:4,a3:4,a4:4,a5:4,a6:4,a7:4,a8:4); writeln;  
writeln('Напечатайте 0 чтобы продолжить и -1 чтобы завершить'); read(flag);  
END  
UNTIL flag < 0;  
END.
Author: d4cen, 2019-12-01

1 answers

You still climb over the border of the array.

exptab[i] := (45 * exptab[i - 1]) mod 256;  

Or

logtab, exptab: ARRAY[0..256] OF integer;
 1
Author: Igor, 2019-12-01 22:05:14