Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2009, 16:37   #1
Matricaria
 
Регистрация: 26.04.2009
Сообщений: 6
По умолчанию Проблема с case и exit в Delphi

Код:
 function Znak_V(var el:String):integer;
  begin
 if el='$'      {стек пуст}       then begin Result:=0; exit; end;
 if el='T - 11' {: конец разбора} then begin Result:=0; exit; end;
 if el='T - 7'  {(}               then begin Result:=1; exit; end;
 if el='T - 5'  {>,<,<=,>=,!=}    then begin Result:=2; exit; end;
 if el='T - 6'  {>,<,<=,>=,!=}    then begin Result:=2; exit; end;
 if el='T - 14' {>,<,<=,>=,!=}    then begin Result:=2; exit; end;
 if el='T - 15' {>,<,<=,>=,!=}    then begin Result:=2; exit; end;
 if el='T - 21' {!=}              then begin Result:=2; exit; end;
 if el='T - 22' {||}              then begin Result:=3; exit; end;
 if el='T - 9'  {&&}              then begin Result:=4; exit; end;
 if el='T - 23' {!}               then begin Result:=5; exit; end;
 if el='T - 8'  {)}               then begin Result:=6; exit; end;
 Result:=66;
end;

   function cl_log_Raz(var i, Ei, Ti, Mi:integer):integer;
var  kodV, kodT, Per:integer;
     elV : String;
begin
 Result:=85;
if  (form1.ListBox5.Items.Strings[i][1]='I') or (form1.ListBox5.Items.Strings[i][1]='L')
     then begin
          inc(Ei);
          E[Ei]:=form1.ListBox5.Items.Strings[i];
          inc(i);
          cl_log_Raz(i,Ei,Ti, Mi);
          end;
ElV:= form1.ListBox5.Items.Strings[i];
kodV:=Znak_V(ElV); if kodV=66  then begin //Номер элемента входа для таблицы переходов
                                      Result:=kodV; exit;
                                      end;
kodT:=Znak_V(T[Ti]); //Номер элемента из стека знаков операци для таблицы переходов
Per:= Tabl_per[kodT,kodV]; // Номер перехода

case Per of
  1: begin  {Поместить элемент на вершину стека Т,
            читать следующий элемент}
      inc(Ti);
      T[Ti]:=form1.ListBox5.Items.Strings[i];
      inc(i);
      cl_log_Raz(i,Ei,Ti, Mi);
     end;
  2: begin
     M[Mi,0]:=T[Ti]; // извлеч из стека Т знак и положить в матрицу операций
     dec(Ti);
     M[Mi,1]:=E[Ei];  // Извлеч из стека Е операнд и положить в матрицу операций
     dec(Ei);
     M[Mi,2]:=E[Ei];  //  Извлеч из стека  Е второй операнд и положить в матрицу операций
     E[Ei]:='M'+' - '+IntToStr(Mi); // Положить в стек Е указатель матрицы
     T[Ti]:=elV;  // Положитьв  стек Т элемент
     inc(i); // Перейти к следующему элементу
     inc(Mi);
     cl_log_Raz(i,Ei,Ti, Mi);
     end;
  3: begin
     M[Mi,0]:=T[Ti]; // извлеч из стека Т знак и положить в матрицу операций
     dec(Ti);
     M[Mi,1]:=E[Ei]; // Извлеч из стека Е операнд и положить в матрицу операций

     E[Ei]:='M'+' - '+IntToStr(Mi); // Положить в стек Е указатель матрицы
     T[Ti]:=elV;  // Положитьв  стек Т элемент
     inc(i); // Перейти к следующему элементу  входной строки
     inc(Mi); // Перейти к следующей строке матрицы операций
     cl_log_Raz(i,Ei,Ti, Mi);
     end;
  4: begin
     M[Mi,0]:=T[Ti]; // извлеч из стека Т знак и положить в матрицу операций
     dec(Ti);
     M[Mi,1]:=E[Ei];  // Извлеч из стека Е операнд и положить в матрицу операций
     dec(Ei);
     M[Mi,2]:=E[Ei];  //  Извлеч из стека  Е второй операнд и положить в матрицу операций
     E[Ei]:='M'+' - '+IntToStr(Mi); // Положить в стек Е указатель матрицы
     inc(Mi);
     cl_log_Raz(i,Ei,Ti, Mi);
     end;
  5: begin  M[Mi,0]:=T[Ti]; // извлеч из стека Т знак и положить в матрицу операций
     dec(Ti);
     M[Mi,1]:=E[Ei];  // Извлеч из стека Е операнд и положить в матрицу операций
     E[Ei]:='M'+' - '+IntToStr(Mi); // Положить в стек Е указатель матрицы
     cl_log_Raz(i,Ei,Ti, Mi);
     end;
  6: begin
     dec(Ti); // Достать из стека Т
     inc(i);  // Перейти к следующему элементу
     cl_log_Raz(i,Ei,Ti, Mi);
     end;
  7: begin
      Result:=69; exit;
     end;
  8: begin
      Result:=-1; exit;
     end;
 else
 Result:=69;
 end; // case

end; // fun


 function cl_log(var i:integer):integer;
var

    Ti :integer; //указатель    стека Т
    Ei :integer; //указатель    стека E
    Mi: integer; //указатель строки матрицы операций

 begin
   // Для сложной логики
 Mi:=0;
 Ei:=0;
 E[Ei]:='$' ;
 Ti:=0;
 T[Ti]:='$' ;
 Result:=cl_log_Raz(i,Ei,Ti,Mi);
 end;
Это код части модуля. Когда выбирается нужный элемент из case, то надо выйти из функции и вернутся туда, от куда ее вызвали. Что собственно обычно и происходит. Выходим вот здесь:
Код:
  7: begin
      Result:=69; exit;
     end;
  8: begin
      Result:=-1; exit;
     end;
После этого, вместо того чтобы завершится, несколько шагов сидит на
Код:
end; // fun
Потом возвращается на строчу
Код:
ElV:= form1.ListBox5.Items.Strings[i];
и заново начинает проверять.
Не пойму в чем причина...
Matricaria вне форума Ответить с цитированием
Старый 20.12.2009, 16:51   #2
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Может эту функцию что-то вызывает? Например цикл?
psycho-coder вне форума Ответить с цитированием
Старый 20.12.2009, 16:55   #3
Matricaria
 
Регистрация: 26.04.2009
Сообщений: 6
По умолчанию

Тут нет циклов. Вся проблема в том что, она просто несколько шагов сидит на end, а потом возвращается на
Код:
ElV:= form1.ListBox5.Items.Strings[i];
Дописывала еще строку перед ней все равно туда. Убирала эту строку в начало, вернулась на строку после нее. Если убрать все до case. То вернулась к case. Я в замешательстве. В другом модуле таким же образом реализовано и всё работает как следует.
Matricaria вне форума Ответить с цитированием
Старый 20.12.2009, 18:21   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Попробуйте перезапустить Delphi) Иногда срабатывает.
А в общем, я даже не знаю с чем это может быть связано.
psycho-coder вне форума Ответить с цитированием
Старый 20.12.2009, 18:31   #5
Matricaria
 
Регистрация: 26.04.2009
Сообщений: 6
По умолчанию

Делфи перезапускала много раз. Вчера до трех ночи сидела с этой ошибкой. Во вторник уже сдавать. Программа работает правильно, только вот в этом месте застревает.
Раньше здесь был While, но потом я переделала алгоритм. Решила вызывать эту же функцию. Может в этом проблема? Хотя как-то глупо...
Matricaria вне форума Ответить с цитированием
Старый 20.12.2009, 18:55   #6
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Может тогда попробовать создать новый проект и в него скопировать этот код? Тоже глупо, но...
psycho-coder вне форума Ответить с цитированием
Старый 20.12.2009, 21:08   #7
Matricaria
 
Регистрация: 26.04.2009
Сообщений: 6
По умолчанию

Проблема решена. Рекурсия - зло! Придется искать другое решение.
Matricaria вне форума Ответить с цитированием
Старый 20.12.2009, 23:18   #8
Анатоль
Пользователь
 
Регистрация: 17.12.2009
Сообщений: 74
По умолчанию

Использование операторов exit и halt является плохим стилем программирования.
Анатоль вне форума Ответить с цитированием
Старый 24.10.2013, 11:21   #9
nadyaH
Форумчанин
 
Регистрация: 24.10.2013
Сообщений: 130
По умолчанию

помогите пожалуйста. Не правильно программа работает.
Даны два целых числа d(дунь) и m(месяц) определяющие правильную дату невысокостного года.вывести значение М и D для даты,предшествующей указанной.
Код:
VAR
D:EXTENDED;
M:1..12;
begin
D:=STRTOFLOAT(EDIT1.Text);
D:=D-1;
IF D=0 THEN
 BEGIN
  M:=M-1;
  IF M=0 THEN M:=12;
  CASE M OF
  1: begin D:=31;exit;end;
  2: begin D:=28;exit;end;
  3: begin D:=31;exit;end;
  4: begin D:=30;exit;end;
  5: begin D:=31;exit;end;
  6: begin D:=30;exit;end;
  7: begin D:=31;exit;end;
  8: begin D:=31;exit;end;
  9:begin D:=30;exit;end;
  10:begin D:=31;exit;end;
  11:begin D:=30;exit;end;
  12:begin D:=31;exit;end;
else m:=m;
EDIT3.Text:=FLOATTOSTR(D);
EDIT4.Text:=FLOATTOSTR(M) ;
END;

END;end;end.
Delphi 7



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 24.10.2013 в 11:27.
nadyaH вне форума Ответить с цитированием
Старый 24.10.2013, 11:30   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Даны два целых числа d(дунь) и m(месяц)
Цитата:
Код:
D:=STRTOFLOAT(EDIT1.Text);
во-первых. А где ввод M ?!

во-вторых, числа целые, поэтому:
Код:
var D : integer;
...
   D := StrToInt(Edit1.Text);

в-третьих,
Цитата:
Код:
else m:=m;
это бессмысленный код. Выкиньте эту строчку напрочь!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сделать в Delphi 7 c помощью case ilnar Помощь студентам 2 16.12.2009 14:08
Проблема с case и read(string). cdtj Помощь студентам 2 11.11.2009 21:55
Проблема между функцией и select case Mary-Salta Microsoft Office Access 0 06.07.2009 09:17
Mouse Exit для TForm JoanM Общие вопросы Delphi 23 25.01.2008 12:54