Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

калькулятор.kum не работает #15

Open
EinstokFair opened this issue Jun 25, 2021 · 3 comments
Open

калькулятор.kum не работает #15

EinstokFair opened this issue Jun 25, 2021 · 3 comments

Comments

@EinstokFair
Copy link

EinstokFair commented Jun 25, 2021

Если закомментировать массиватор и стоп, то при вычислении первого же выражения выдаётся ошибка:

>> 12:43:14 - калькулятор.kum - Начало выполнения
ОШИБКА ВЫПОЛНЕНИЯ: Значение не строковое
>> 12:44:19 - калькулятор.kum - Выполнение завершено 64.908

Происходит это при вызове алгоритма "длин":

алг получи терминал(лит выражение, цел позиция, рез цел код токена)
нач
  цел длина_выражения
  длина_выражения := длин(выражение)
  если позиция > длина_выражения
    то 
      код токена := 8
    иначе
      выбор
         при выражение[позиция] = '+': код токена := 1
         при выражение[позиция] = '-': код токена := 2
         при выражение[позиция] = '*': код токена := 3
         при выражение[позиция] = '/': код токена := 4
         при выражение[позиция] = '(': код токена := 5
         при выражение[позиция] = ')': код токена := 6
         при выражение[позиция] = '1': код токена := 7
       иначе стоп
     всё
   всё
кон

И только тогда, когда длина строки равна 1. Для 0 и 2+ всё работает нормально.

@a-a-maly
Copy link
Owner

Thanks, here is a more precise program showing this bug:

алг маин
нач
цел кт = -1
лит выр = "3"
получи терминал("3", 1, кт)
вывод кт
кон

алг получи терминал(лит выражение, цел позиция, рез цел код токена)
нач
цел длина_выражения
длина_выражения := длин(выражение)
если позиция > длина_выражения
то 
код токена := 8
иначе
выбор
при выражение[позиция] = '+': код токена := 1
при выражение[позиция] = '-': код токена := 2
при выражение[позиция] = '*': код токена := 3
при выражение[позиция] = '/': код токена := 4
при выражение[позиция] = '(': код токена := 5
при выражение[позиция] = ')': код токена := 6
при выражение[позиция] = '1': код токена := 7
иначе стоп
всё
всё
кон

If we pass the argument not as a literal constant, but as a variable выр containg 1-char value, it works. Even if we pass the argument implicitly, via Kumir feature to read input arguments of the main algorithm from keyboard, it still works.
I guess, this strange magic of passing 1-char literal value as сим instead of лит may be due to the ancient ideas that we should "help" people make less bugs, allowing them to place symbols in double quotes like "3" instead of the correct expression '3'.

There may be two ways to fix this bug:

  1. (better) to disallow such a strange behaviour of explicit literals. But it can break a lot of incorrect user programs.
  2. extend длин function to сим arguments.

I can guess that I broke this code when I was optimizing the strings behaviour. That optimization is still on its way, so we will possibly have to address this issue many times.

@EinstokFair
Copy link
Author

我完全高兴地这析,谢谢你的贡献。

@EinstokFair
Copy link
Author

EinstokFair commented Jun 29, 2021

Я поменял код примерно таким образом:

алг считай (лит выражение2, рез вещ р)
нач
    лит выражение
    выражение := выражение2 + ""

однако калькулятор не заработал.
На этот раз

>> 19:20:11 - калькулятор.kum - Начало выполнения
ОШИБКА ВЫПОЛНЕНИЯ: Выход за границу таблицы
>> 19:20:11 - калькулятор.kum - Выполнение завершено 0.402 

В коде калькулятора нет гиперссылки на статью, в которой описано, как составлялись таблицы,
поэтому проверить их невозможно (кажется, что проще написать новые).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants