for j:=1 to 178 do
G[j]:=j*j;
и ни как не касается Nmax. Я решил ее вообще убрать и маненько изменил Enter.
2) Внешний цикл вы имеете виду
......
for i:=1 to N do...
......
......
end;
.......
Если да, то честно говоря не вижу причин его не использовать разве может из за того что в конце может у N отнимется 1, а N уже внесена в услувие цикла? Но я все равно поменял

3) Поменял на
for w:=i .....
4) Поменял var N:integer;
program Masiv;
uses crt;
type mas= array [1..16] of integer;
var G,M:mas; var N:integer;
procedure Enter (var M:mas; var N:integer);
var i,x:integer;
begin
N:=0;
for i:=1 to 16 do
begin
write ('M[',i,']=');
readln (x);
if x=0 then break;
inc (N); M[i]:=x;
end;
end;
procedure Print (var M:mas; N:integer);
var i:integer;
begin
for i:=1 to N do
write (M[i],'; ');
writeln;
end;
procedure Work (var M:mas; var G:mas; var N:integer);
var j,i,w,b,sym,ost:integer; f,q:boolean;
begin
for j:=1 to 178 do
G[j]:=j*j;
while i>N do
begin
i:=1;
begin f:=true; sym:=0; ost:=0; q:=false;
b:=m[i];
for j:=1 to 178 do
begin
if g[j]=m[i] then
begin
q:=true; break;
end;
end;
repeat
ost:=b mod 10;
sym:=sym + ost;
b:=b div 10;
until b=0;
if sym mod 2=0 then f:=false;
if (f=true) and (q=true) then
begin
for w:=i to N do
m[i]:=m[i+1];
N:=N-1;
end;
inc(i);
end;
end;
end;
Begin clrscr;
Enter (M,N);
Print (M,N);
Work (M,G,N);
Print (M,N);
readkey
End.
По прежнему выдает ошибку тамже где и выдовала в Print.
Скиньте плиз ваш полный вариант, а то чую не успею отладить до четверга.