Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1148748141
Ярослав
2006-05-27 20:42
2006.07.09
Вызов MDI из DLL


1-1148546057
Alex35
2006-05-25 12:34
2006.07.09
Создать меню для дочерней формы


2-1151083509
resuS
2006-06-23 21:25
2006.07.09
SOCKS прокси сервер 4/5


3-1147104200
Nicky
2006-05-08 20:03
2006.07.09
как посчитать сумму через запрос


15-1149852050
Slava812
2006-06-09 15:20
2006.07.09
Переводчик страниц





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский