Главная страница
    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.008 c
15-1150129025
Yanis
2006-06-12 20:17
2006.07.09
Как то неожиданно вспомнилось...


15-1150178322
Ega23
2006-06-13 09:58
2006.07.09
С Днём рождения! 12 июня


2-1150380700
irena
2006-06-15 18:11
2006.07.09
синтаксис оператора with


5-1135002673
Afonya
2005-12-19 17:31
2006.07.09
Добавления компонента в IDE (через создание пакета)


2-1150997598
Hanzo
2006-06-22 21:33
2006.07.09
Работа с кодировкой S-jis.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский