![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с модулем(Паскаль) [XP]
resuS © (2006-06-21 07:46:00)Есть программа и к ней модуль. Программа вычисляет постфиксное выражение. Должна вычислять:) Но после ввода самого выражения открывается код модуля и выводится сообщение об ошибке "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.
Плохиш (2006-06-21 11:19:00) [1]
> resuS (21.06.06 10:43) [3]
> icWasya а зачем именно
> procedure Stroka(str:string; varresult:longint); //!!
> !!!!!!!!
А результат выполнения процедуры тебе нужен или нет?
> Не знаю как дебаггером пользоваться при работе с модулем
Хорошая фраза, учитывая, что программирование на паскале модульное :-)
resuS (2006-06-21 10:43:00) [2]Все, спасибо, я уже сам разобрался. Глупая ошибка
Не знаю как дебаггером пользоваться при работе с модулем... да меня и не учили, сам учусь...
icWasya а зачем именно
procedure Stroka(str:string; var result:longint); //!!!!!!!!!!
icWasya (2006-06-21 10:05:00) [3]ну чтобы только работало
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.
novill (2006-06-21 09:59:00) [4]а отладчиком (debugger) пользоваться учили?
вот например
1. чему у тебя равно i при первом вызове stroka
2. как у тебя ведет себя программа когда первым символом становится пробел?