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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2011, 14:07   #1
Bizunov
Пользователь
 
Регистрация: 16.04.2011
Сообщений: 36
По умолчанию

Всем привет. Так уж получилось, что я начал писать интерпретатор бейсико-подобного языка на PascalABC. Потом я захотел скомпилировать исходник, но такой функции не обнаружил. Погуглив, понял, что компилировать может только версия для Нет платфромы. Скачал, открыл исходник, запускаю и первая же ошибка - "iBasic.pas(51) : Нельзя изменять значение переменной цикла внутри этого цикла". Собственно, это и вся проблема. Не изменяя значение переменной в цикле, у меня будет некорректно работать процедуры для вычисления значения мат. выражения, на которые я потратил большую часть времени. Поможете?

Вот код, может что подскажете )
Код:
{-----===== Вычисление значения выражения =====-----}
//Разбиение строки
procedure ParseMath(Str: string);
var
  Ind: integer;
  Buf: string;
  i: integer;
begin
  Str := Str+'.';
  Ind := 0;
  Buf := '';

  for i := 1 to Length(Str) do
  begin
    if (IsDigits(Str[i])) then
      Buf := Buf+Str[i]
    else begin
      Math[Ind] := Buf; Inc(Ind);
      Math[Ind] := Str[i]; Inc(Ind);
      Buf := '';
    end;
  end;
end;
//Вычисление
procedure ComputeMath;
var
  l: integer;
  i: integer;
  j: integer;
  LVal: integer;
  RVal: integer;
begin
  for l := 0 to 1 do
  begin
    for i := 1 to MthBuff-1 do
    begin
      if (((Math[i] = '*') or (Math[i] = '/')) and (l = 0))
      or (((Math[i] = '+') or (Math[i] = '-')) and (l = 1)) then
      begin
        LVal := StrToInt(Math[i-1]);
        RVal := StrToInt(Math[i+1]);
        if (Math[i] = '*') then Math[i-1] := IntToStr(LVal*RVal);
        if (Math[i] = '/') then Math[i-1] := IntToStr(LVal div RVal);
        if (Math[i] = '+') then Math[i-1] := IntToStr(LVal+RVal);
        if (Math[i] = '-') then Math[i-1] := IntToStr(LVal-RVal);
        for j := i to 30 do Math[j] := Math[j+2];
        i := 0; continue;
      end;
    end;
  end;
end;

Последний раз редактировалось Stilet; 18.04.2011 в 20:42.
Bizunov вне форума Ответить с цитированием
Старый 16.04.2011, 17:33   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я не знаю, что Вы там за ужас понаписали в коде (не разбирался).
Но формальный ответ на Ваш вопрос - компилятор АБСОЛЮТНО прав. Нельзя менять переменную цикла внутри цикла!

Как выйти из этой ситуации? А ОЧЕНЬ просто! Меняйте цикл FOR на цикл с предусловием (или с постусловием - если так удобнее).

например, вместо:
Код:
 for i := 1 to MthBuff-1 do
    begin
      if ...... then
      begin
          ......
        i := 0; continue; 
      end;
    end;
пишем примерно так:
Код:
 i := 1; 
 While i<= (MthBuff-1) do
    begin
      if ...... then
      begin
          ......
        i := 1; continue;        // цикл у Вас от единицы, потому не уверен, что присваивать ноль - это логично!!!
      end;
      inc(i);
    end;

Последний раз редактировалось Serge_Bliznykov; 16.04.2011 в 17:35.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.04.2011, 19:13   #3
Bizunov
Пользователь
 
Регистрация: 16.04.2011
Сообщений: 36
По умолчанию

Этот "Ужас" и есть интерпретатор мат. выражений. Может он и хреновый, зато свой ) В любом случае, в будущем при накоплении опыта, я все поправлю ) Я вообще первокурсник, мы изучали только введение в специальность (((
Благодарю за код, идею понял, попробую реализовать )
Bizunov вне форума Ответить с цитированием
Старый 16.04.2011, 20:26   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Этот "Ужас" и есть интерпретатор мат. выражений. Может он и хреновый, зато свой )
погодите-ка! я же не говорил, что он хреновый! я сказал, что не разбирался в коде! И ничего более того!
Поэтому прошу не рассматривать мои слова про "ужас" - как хулу на Ваш код!

Цитата:
Благодарю за код, идею понял, попробую реализовать )
не за что! Успехов в разработке!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.04.2011, 09:43   #5
Bizunov
Пользователь
 
Регистрация: 16.04.2011
Сообщений: 36
По умолчанию

Цитата:
погодите-ка! я же не говорил, что он хреновый! я сказал, что не разбирался в коде! И ничего более того!
Поэтому прошу не рассматривать мои слова про "ужас" - как хулу на Ваш код!
Хорошо ) Но я уже смотрю в сторону обратной польской нотации )
Цитата:
не за что! Успехов в разработке!
Спасибо )
Bizunov вне форума Ответить с цитированием
Старый 18.04.2011, 20:39   #6
Bizunov
Пользователь
 
Регистрация: 16.04.2011
Сообщений: 36
По умолчанию

Всем еще раз привет )
Сегодня у меня к вам 2 вопроса )
1) Stack: string;
Push - Stack += 'value';
Pop - Val = Stack[Length(Stack)];
Empty - Length(Stack);
Вопрос - быстро ли такой стек работает?
2) Есть ли у вас хороший стек в виде юнита? Мой, который сейчас представляет собой строку работает нормально, но подходит не для всех операций ((( Нашел исходник другого стека, оформил для юнита и узнал, что он багованый (

Короче, нужен стек )
Bizunov вне форума Ответить с цитированием
Старый 18.04.2011, 20:46   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
быстро ли такой стек работает?
Нет. Строка заново пересоздается с дописанным в конце.
Строка для стека не годится.
Хотя если написать
Код:
Stack: string[300];
То возможно оптимизатор не будет пересоздавать строку.
Кстати:
Цитата:
Push - Stack += 'value';
Это явно не операция со стеком
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.04.2011, 20:55   #8
Bizunov
Пользователь
 
Регистрация: 16.04.2011
Сообщений: 36
По умолчанию

Блин, медленно - плохо.
Цитата:
Это явно не операция со стеком
Да нет, вы просто не знаете как работает мой стек )

П.С. Я все еще желаю увидеть реализацию не багованного стека )
Bizunov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PascalABC.Net Открытие html страниц Poman Помощь студентам 1 05.02.2011 09:41
PascalABC.net *stRong* Помощь студентам 2 10.06.2010 17:50
PascalABC.NET, windows.forms *stRong* Помощь студентам 0 03.06.2010 21:47
Создание теста на PascalABC.NET *stRong* Паскаль, Turbo Pascal, PascalABC.NET 1 03.06.2010 19:41
Графика PascalABC.NET Ученик. Помощь студентам 6 04.02.2010 15:24