Форум: "Начинающим";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];
ВнизПроблема с модулем(Паскаль) Найти похожие ветки
← →
resuS (2006-06-21 07:46) [0]Есть программа и к ней модуль. Программа вычисляет постфиксное выражение. Должна вычислять:) Но после ввода самого выражения открывается код модуля и выводится сообщение об ошибке "203: heap overflow error."
!!!!Все написано в Паскале!!!!
Программа:program postf;
uses
PostUnit, Crt;
var
s:string;
l:longint;
begin
ClrScr;
Writeln("Vvedite postficsalnoe viragenie (primer: "10 15 + 2 * 10 / 5 +" otvet: 10 ; pisat bez kavichek) ");
s:="";
ReadLn(s);
Stroka(s,l);
Writeln(l);
Readkey;
end.
Модуль:Unit PostUnit;
interface
Type
Ukaz=^ stek;
Stek = record
num1:longint;
next:Ukaz;
end;
Var
top,P:Ukaz;
procedure AddStek(znak:longint);
procedure DelStek;
procedure obrabotka(dey:integer);
procedure Stroka(str:string; result:longint);
implementation
{procedure AddStek(znak:longint);}
procedure AddStek;
begin
New(P);
P^.num1:=znak;
P^.Next:=top;
top:=P;
end;
procedure DelStek;
begin
P:=top;
top:=top^.Next;
Dispose(P);
end;
{procedure obrabotka(dey:integer);}
procedure obrabotka;
var
N:integer;
begin
if dey=1 then { + }
begin
P:=top;
N:=P^.num1;
P:=P^.Next;
N:=N+P^.num1;
end
else
if dey=2 then { - }
begin
P:=top;
N:=P^.num1;
P:=P^.Next;
N:=N-P^.num1;
end
else
if dey=3 then { * }
begin
P:=top;
N:=P^.num1;
P:=P^.Next;
N:=N*P^.num1;
end
else
if dey=4 then { / }
begin
P:=top;
N:=P^.num1;
P:=P^.Next;
N:=round(N/P^.num1);
end;
DelStek;
{ DelStek;}
AddStek(N);
end;
{procedure Stroka(str:string; result:longint);}
procedure Stroka;
var
code,i:integer;
m:longint;
zn:string;
begin
While str<>" " do
begin
i:=i+1;
if str[i]=" " then
begin
zn:=copy(str,0,i);
str:=copy(str,i,length(str)-i+1);
i:=0;
m:=0;
if zn="+" then obrabotka(1) else
if zn="-" then obrabotka(2) else
if zn="*" then obrabotka(3) else
if zn="/" then obrabotka(4) else
begin
val(zn,m,code);
AddStek(m);
end;
end;
end;
P:=top;
Result:=P^.num1;
end;
end.
← →
novill © (2006-06-21 09:59) [1]а отладчиком (debugger) пользоваться учили?
вот например
1. чему у тебя равно i при первом вызове stroka
2. как у тебя ведет себя программа когда первым символом становится пробел?
← →
icWasya © (2006-06-21 10:05) [2]ну чтобы только работало
unit PostUnit;
interface
Type
Ukaz=^ stek;
Stek = record
num1:longint;
next:Ukaz;
end;
Var
top,P:Ukaz;
procedure AddStek(znak:longint);
procedure DelStek;
procedure obrabotka(dey:integer);
procedure Stroka(str:string; var result:longint); //!!!!!!!!!!
implementation
{procedure AddStek(znak:longint);}
procedure AddStek;
begin
New(P);
P^.num1:=znak;
P^.Next:=top;
top:=P;
end;
procedure DelStek; // хорошо бы проверять на отсутствие элементов в стеке
begin
P:=top;
top:=top^.Next;
Dispose(P);
end;
{procedure obrabotka(dey:integer);}
procedure obrabotka;
var
N:integer;
begin
if dey=1 then { + }
begin
P:=top;
N:=P^.num1;
P:=P^.Next;
N:=N+P^.num1;
end
else
if dey=2 then { - }
begin
P:=top;
N:=P^.num1;
P:=P^.Next;
N:=N-P^.num1;
end
else
if dey=3 then { * }
begin
P:=top;
N:=P^.num1;
P:=P^.Next;
N:=N*P^.num1;
end
else
if dey=4 then { / }
begin
P:=top;
N:=P^.num1;
P:=P^.Next;
N:=round(N/P^.num1);
end;
DelStek;
DelStek; //!!!!!!!!!!!!
AddStek(N);
end;
{procedure Stroka(str:string; result:longint);}
procedure Stroka;
var
code,i:integer;
m:longint;
zn:string;
begin
i:=0; //!!!!!!!!!!!!!!
while str<>"" do
begin
i:=i+1;
if (str[i]=" ") or (i>Length(str)) then //!!!!!!!!!!!
begin
zn:=copy(str,1,i-1);
str:=copy(str,i+1,length(str)-i+1); //!!!!!!!!!!
i:=0;
m:=0;
if zn="+" then obrabotka(1) else
if zn="-" then obrabotka(2) else
if zn="*" then obrabotka(3) else
if zn="/" then obrabotka(4) else
begin
val(zn,m,code);
AddStek(m);
end;
end;
end;
P:=top;
Result:=P^.num1;
end;
end.
← →
resuS (2006-06-21 10:43) [3]Все, спасибо, я уже сам разобрался. Глупая ошибка
Не знаю как дебаггером пользоваться при работе с модулем... да меня и не учили, сам учусь...
icWasya а зачем именно
procedure Stroka(str:string; var result:longint); //!!!!!!!!!!
← →
Плохиш © (2006-06-21 11:19) [4]
> resuS (21.06.06 10:43) [3]
> icWasya а зачем именно
> procedure Stroka(str:string; var result:longint); //!!
> !!!!!!!!
А результат выполнения процедуры тебе нужен или нет?
> Не знаю как дебаггером пользоваться при работе с модулем
Хорошая фраза, учитывая, что программирование на паскале модульное :-)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c