Pascal 为什么这不起作用

Pascal 为什么这不起作用,pascal,freepascal,Pascal,Freepascal,所以我有这个密码 program test; var a, b, k, i, aux, j :integer; ok :boolean; begin write('a='); readln(a); write('b='); readln(b); if a > b then begin aux := a; a := b; b := aux; end; for i := a to b do begin ok := true

所以我有这个密码

program test;
var a, b, k, i, aux, j  :integer;
    ok :boolean;
begin
write('a=');
readln(a);

write('b=');
readln(b);

if a > b then
    begin
    aux := a;
    a := b;
    b := aux;
    end;

for i := a to b do
    begin
    ok := true;

    { finding the first divizor }
    k := 2;
    while i mod k <> 0 do
        k := k + 1;

    if k*k = i then { if the number i is pp }
        begin
        for j := 2 to trunc(sqrt(k)) do { check if that k is prime }
            if k mod j = 0 then
                begin
                ok := false;
                break
                end;
        end
    else
        ok := false;

    if ok then
        writeln(i);
    end;
writeln;
end.
输出应为:

4
9
25

25 = 5 * 5 -> is prime 
9 = 3 *3 -> prime 
4 = 2* 2 -> also prime
但我得到了这个错误:

Runtime error 216 at $0000000000400399
我知道这意味着什么。。。对于一些评论和尝试的东西,我认为它来自代码的这一部分

begin   

for j := 2 to trunc(sqrt(k)) do { check if that k is prime }
            if k mod j = 0 then
                begin
                ok := false;
                break
                end;
end
但我不明白为什么

我真的需要一些帮助,我不想要更好的算法,我只是想知道为什么会发生这个错误

我正在使用免费的Pascal 2.6.2


谢谢

错误其实就在这里:

k := 2;
while i mod k <> 0 do
    k := k + 1;

你能检查一下开关线路上的调试吗?216:一般保护故障应用程序试图访问无效的内存空间。这可能是由以下几个问题造成的:1。对零指针2的微分。尝试访问超出范围的内存(例如,调用长度无效的move)。现在我在linux上,不使用IDE,我只是编译,但如果我将
trunc(sqrt(k))
更改为
k-1
,它会工作,所以我认为它在这一行。我知道错误,但为什么会出现错误?我也用谷歌搜索它。。。我不使用指针,也不使用奇特的内置函数/过程。。。我不明白。修改
,而我修改k0做k:=k+1
包含一个
Writeln(i,k,i mod k)
并查看输出中的内容。(您希望手头有一个调试器;准备好使用Ctrl+C或Ctrl+Break。)
k := 2;
while i mod k <> 0 do
    k := k + 1;
k := 2;
while (i mod k <> 0) and (i>=k) do
    k := k + 1;