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;