Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.09;
Скачать: CL | DM;

Вниз

Проблема с модулем(Паскаль)   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
15-1149860076
StriderMan
2006-06-09 17:34
2006.07.09
Можно ли написать прогу для PIC-контроллера на Делфи?


9-1131870180
Silica
2005-11-13 11:23
2006.07.09
Игры


2-1150900068
fast2
2006-06-21 18:27
2006.07.09
Подскажите, как реализовать такое.


15-1150125324
antonn
2006-06-12 19:15
2006.07.09
Помогите на англицкий перевести...


11-1128946067
BMouradov
2005-10-10 16:07
2006.07.09
Ошибка PBitMap, начиная с 2.13