主题:[原创]PASCAL漏洞????????
shisutianxia
[专家分:630] 发布于 2007-10-14 10:42:00
绝对让你大吃一惊,一个PASCAL程序连续运行,对同样的输入竟有不同的答案输出,天啊,那我岂不是白写了这程序,紧急求助----------
(一下这个程序按上面所说运行一下)!!!!!!!!!
program canlator;
type ty=array[0..100]of integer;
var i,j:integer;
sm,sn:string;m,n:ty;
PROCEDURE xuzheng(var a:ty);
var i:integer;
begin
while (a[a[0]]=0)and(a[0]>1)do
a[0]:=a[0]-1;
end;
PROCEDURE add(var a,b:ty);
var l:ty;i,p:integer;
begin
if a[0]>b[0] then begin
for i:=1 to a[0] do
l[i]:=a[i];
l[0]:=a[0]+1;
for i:=1 to b[0] do
begin
p:=l[i]+b[i];
l[i]:=p mod 10;
l[i+1]:=l[i+1]+p div 10;
end;
end
else begin
for i:=1 to b[0] do
l[i]:=b[i];
l[0]:=b[0]+1;
for i:=1 to a[0] do
begin
p:=l[i]+a[i];
l[i]:=p mod 10;
l[i+1]:=l[i+1]+p div 10;
end;
xuzheng(l);a[0]:=l[0];
for i:=1 to l[0] do
a[i]:=l[i];
end;
end;
procedure mul(var a:ty;x:integer);
var p,i:integer;
begin
p:=0;
for i:=1 to a[0] do
begin
inc(p,a[i]*x);
if p>10 then a[i]:=p mod 10 else a[i]:=p;
p:=p div 10;
end;
while p>0 do
begin
inc(a[0]);
if p>10 then a[a[0]]:=p mod 10 else a[a[0]]:=p;
p:=p div 10;
end;
xuzheng(a);
end;
procedure chen(var a,b:ty);
var l,t:ty;i,j:integer;
begin
for i:=1 to a[0] do l[i]:=0;l[0]:=a[0];
for i:=1 to b[0] do
begin
for j:=1 to a[0] do
t[j]:=a[j];
t[0]:=a[0];
mul(t,b[i]);
for j:=t[0]+i-1 downto 1+i-1 do
t[j]:=t[j-i+1];
for j:=1 to i-1 do
t[j]:=0;
t[0]:=t[0]+i-1;
add(l,t);
for j:=1 to l[0] do
a[j]:=l[j];a[0]:=l[0];
end;
end;
begin
writeln('m,n');
readln(sm);
readln(sn);
for i:=1 to length(sm) do
m[length(sm)-i+1]:=ord(sm[i])-ord('0');
m[0]:=length(sm);
for i:=1 to length(sn) do
n[length(sn)-i+1]:=ord(sn[i])-ord('0');
n[0]:=length(sn);
chen(m,n);
for i:=m[0] downto 1 do
write(m[i]);
end.[em10][em10][em10][em10][em10]
回复列表 (共13个回复)
沙发
shisutianxia [专家分:630] 发布于 2007-10-14 10:44:00
有谁在?????帮忙解释一下
板凳
angwuy [专家分:2280] 发布于 2007-10-14 10:54:00
能把程序的大概意思说一下吗?
3 楼
shisutianxia [专家分:630] 发布于 2007-10-14 11:05:00
高精度乘法运算,模拟手工算法T数组用于保存A数组*B数组的第I位(A,B数组都是反向储存的),多次帮忙,真是太谢谢你了!!!!ANGWUY
4 楼
angwuy [专家分:2280] 发布于 2007-10-14 11:19:00
你用哪个编译器?
用了哪些数据?
5 楼
shisutianxia [专家分:630] 发布于 2007-10-14 11:27:00
TROUB PASCAL
你试一下,输入
11
11
执行后,答案为121
再输入
11
11
执行后,答案为221
多次输入,答案不一样
6 楼
angwuy [专家分:2280] 发布于 2007-10-14 11:35:00
原因是没做初始化工作,修改后的:
program canlator;
type ty=array[0..100]of integer;
var i,j:integer;
sm,sn:string;m,n:ty;
PROCEDURE xuzheng(var a:ty);
var i:integer;
begin
while (a[a[0]]=0)and(a[0]>1)do
a[0]:=a[0]-1;
end;
PROCEDURE add(var a,b:ty);
var l:ty;i,p:integer;
begin
fillchar(l,sizeof(l),0);
if a[0]>b[0] then begin
for i:=1 to a[0] do
l[i]:=a[i];
l[0]:=a[0]+1;
for i:=1 to b[0] do
begin
p:=l[i]+b[i];
l[i]:=p mod 10;
l[i+1]:=l[i+1]+p div 10;
end;
end
else begin
for i:=1 to b[0] do
l[i]:=b[i];
l[0]:=b[0]+1;
for i:=1 to a[0] do
begin
p:=l[i]+a[i];
l[i]:=p mod 10;
l[i+1]:=l[i+1]+p div 10;
end;
xuzheng(l);a[0]:=l[0];
for i:=1 to l[0] do
a[i]:=l[i];
end;
end;
procedure mul(var a:ty;x:integer);
var p,i:integer;
begin
p:=0;
for i:=1 to a[0] do
begin
inc(p,a[i]*x);
if p>10 then a[i]:=p mod 10 else a[i]:=p;
p:=p div 10;
end;
while p>0 do
begin
inc(a[0]);
if p>10 then a[a[0]]:=p mod 10 else a[a[0]]:=p;
p:=p div 10;
end;
xuzheng(a);
end;
procedure chen(var a,b:ty);
var l,t:ty;i,j:integer;
begin
fillchar(l,sizeof(l),0);
fillchar(t,sizeof(t),0);
for i:=1 to a[0] do l[i]:=0;l[0]:=a[0];
for i:=1 to b[0] do
begin
for j:=1 to a[0] do
t[j]:=a[j];
t[0]:=a[0];
mul(t,b[i]);
for j:=t[0]+i-1 downto 1+i-1 do
t[j]:=t[j-i+1];
for j:=1 to i-1 do
t[j]:=0;
t[0]:=t[0]+i-1;
add(l,t);
for j:=1 to l[0] do
a[j]:=l[j];a[0]:=l[0];
end;
end;
begin
fillchar(m,sizeof(m),0);
fillchar(n,sizeof(n),0);
writeln('m,n');
readln(sm);
readln(sn);
for i:=1 to length(sm) do
m[length(sm)-i+1]:=ord(sm[i])-ord('0');
m[0]:=length(sm);
for i:=1 to length(sn) do
n[length(sn)-i+1]:=ord(sn[i])-ord('0');
n[0]:=length(sn);
chen(m,n);
for i:=m[0] downto 1 do
write(m[i]);
end.
7 楼
shisutianxia [专家分:630] 发布于 2007-10-14 11:49:00
太谢谢了!我可得注意这些问题,使用动态变量没有释放也会出现类似的问题
,我怎么就没想起来呢?教训!!!!!!!!
8 楼
Matodied [专家分:7560] 发布于 2007-10-14 11:54:00
在TP中程序结束后变量可能不会被释放,所以要求初始化。
如果在函数或过程中输出没有被初始化的变量,那么结果更离谱,因为函数或过程中所有变量的初始值都是随机的。
9 楼
shisutianxia [专家分:630] 发布于 2007-10-14 13:25:00
哦,是这样呀!!!!谢谢
10 楼
Matodied [专家分:7560] 发布于 2007-10-14 13:41:00
这确实是PASCAL的一个漏洞,QB里没有这样的事情发生。
所以好的习惯是把每个变量尤其是数组全部初始化。
我来回复