Автор | Сообщение |
|
| |
Сообщение: 21
Зарегистрирован: 23.11.12
|
|
Отправлено: 15.03.14 13:10. Заголовок: Некорректная обработка кода(?)
Привет всем участникам сообщества. Написал код вот такого вида: :1 pln введите пароль: instr pass1= input pass1 if pass#count_1$=="abc2" then pln есть& else pln нет end Далее запускаю это через Акурку и ввожу в редактор текст "abc2" (без кавычек естественно). После нажатия на энтер на экран почему-то выводится "нет". В моём коде есть ошибка или это такой баг в самой Акурке? Заранее спасибо!
|
|
Профиль
Цитата
Ответить
|
Новых ответов нет
, стр:
1
2
All
[см. все]
|
|
|
| постоянный участник
|
Сообщение: 77
Зарегистрирован: 05.08.08
|
|
Отправлено: 15.03.14 21:57. Заголовок: Счетчик переходов на..
Счетчик переходов на локацию обновляется только если на нее привела кнопка. Т.е. #count_1$ имеет значение 0. Вот, чтобы убедиться: :1 pln count_1=#count_1$ pln введите пароль: instr pass1= input pass1 pln count_1=#count_1$, pass1='#%pass1$', pass#count_1$='#%pass#count_1$$' if pass#count_1$=="abc2" then pln есть& else pln нет btn 1, А если нажать на btn? end Пароль будет принят только во второй попытке. Вообще, чтобы разобраться, что не так, pln - чуть ли не единственное действенное средство.
|
|
Профиль
Цитата
Ответить
|
|
| |
Сообщение: 22
Зарегистрирован: 23.11.12
|
|
Отправлено: 16.03.14 00:15. Заголовок: Frodo, Акурка ведёт ..
Frodo, Акурка ведёт себя в этом отношении нитак, как фурка. Я проверил, count_1=1 на момент ввода пароля, а значит переменная pass1 должна пониматься правильно...
|
|
Профиль
Цитата
Ответить
|
|
| постоянный участник
|
Сообщение: 78
Зарегистрирован: 05.08.08
|
|
Отправлено: 16.03.14 12:55. Заголовок: К сожалению, на моем..
К сожалению, на моем Debian Акурка не идет. Все, что могу предложить - внимательно изучить вывод Pln (шестая строка в коде, который я предложил выше). Кстати, а что он выдает?
|
|
Профиль
Цитата
Ответить
|
|
| |
Сообщение: 23
Зарегистрирован: 23.11.12
|
|
Отправлено: 16.03.14 15:37. Заголовок: Frodo, выдаётся букв..
Frodo, выдаётся буквально следующее: count_1=1 введите пароль: count_1=1, pass1="abc2", pass1="abc2" нет Всё правильно, только условная конструкция "if pass#count_1$="abc2" then pln да& else pln нет" почему-то возвращает false.
|
|
Профиль
Цитата
Ответить
|
|
| постоянный участник
|
Сообщение: 79
Зарегистрирован: 05.08.08
|
|
Отправлено: 16.03.14 16:25. Заголовок: У меня есть три вари..
У меня есть три варианта: 1. Заменить pass#count_1$ на pass1 (зачем тут вообще подставлять count_1?). 2. Убрать "&" перед else. 3. Попробовать "=" вместо "==". В любом случае, если это баг Акурки, его, скорее всего, никто исправлять не будет.
|
|
Профиль
Цитата
Ответить
|
|
| постоянный участник
|
Сообщение: 83
Зарегистрирован: 02.01.09
|
|
Отправлено: 16.03.14 16:52. Заголовок: Prime, а какая верси..
Prime, а какая версия Акурки? Насколько помню, в pre 6 такой баг (не воспринималась конструкция #$ в именах переменных) действительно был (в pre 1 его, кажется, не было).
|
|
Профиль
Цитата
Ответить
|
|
| |
Сообщение: 24
Зарегистрирован: 23.11.12
|
|
Отправлено: 16.03.14 17:12. Заголовок: Veto, у меня Акурка ..
Veto, у меня Акурка 1.28.pre3, причём #$ и #%$ в именах переменных во всех случаях (кроме данного с паролем) воспринимается абсолютно корректно. Frodo, спасибо за совет, но все перечисленные вами варианты я уже пробовал - они не дали эффекта.
|
|
Профиль
Цитата
Ответить
|
|
| |
Сообщение: 25
Зарегистрирован: 23.11.12
|
|
Отправлено: 16.03.14 17:16. Заголовок: Ах да, ещё насчёт за..
Ах да, ещё насчёт замены #count_1$ на просто 1. Дело в том, что данный код (а точнее пример кода) лиш коротенький отрывок из большой и очень сложной по структуре игры, в которой необходимо генерировать множество переменных с порядковыми номерами. Подстановка используется с целью сокращения объёма программы и воизбежание дальнейшей путаницы в коде.
|
|
Профиль
Цитата
Ответить
|
|
| постоянный участник
|
Сообщение: 85
Зарегистрирован: 02.01.09
|
|
Отправлено: 16.03.14 18:12. Заголовок: Можно еще попробоват..
Можно еще попробовать так (на случай, если ошибочно обрабатывается подстановка #$ именно в условном операторе): :1 pln введите пароль: instr pass1= input pass1 instr mypass=pass#count_1$ if mypass=="abc2" then pln есть& else pln нет end Жирным выделены модификации исходного примера.
|
|
Профиль
Цитата
Ответить
|
|
| |
Сообщение: 26
Зарегистрирован: 23.11.12
|
|
Отправлено: 16.03.14 21:56. Заголовок: Жаль, но даже это не..
Жаль, но даже это не работает... Причём пробовал и на Акурке pre3и на pre6 - нулевой результат - на экране "нет"
|
|
Профиль
Цитата
Ответить
|
|
| постоянный участник
|
Сообщение: 81
Зарегистрирован: 05.08.08
|
|
Отправлено: 16.03.14 22:38. Заголовок: Vito пишет: instr my..
Vito пишет: цитата: | instr mypass=pass#count_1$ |
| Может быть, все-таки так: mypass=pass#count_1$ или так: instr mypass=#pass#count_1$$
|
|
Профиль
Цитата
Ответить
|
|
|
| постоянный участник
|
Сообщение: 86
Зарегистрирован: 02.01.09
|
|
Отправлено: 17.03.14 04:27. Заголовок: frodo пишет: Может ..
frodo пишет: цитата: | Может быть, все-таки так: |
| Или еще так: instr mypass=#%pass#count_1$$
|
|
Профиль
Цитата
Ответить
|
|
| постоянный участник
|
Сообщение: 84
Зарегистрирован: 05.08.08
|
|
Отправлено: 21.03.14 01:06. Заголовок: Prime, ну так что? П..
Prime, ну так что? Получилось что-нибудь?
|
|
Профиль
Цитата
Ответить
|
|
| |
Сообщение: 28
Зарегистрирован: 23.11.12
|
|
Отправлено: 21.03.14 22:01. Заголовок: Frodo, к сожалению -..
Frodo, к сожалению - ничего. Разработку придётся застопорить... :(((
|
|
Профиль
Цитата
Ответить
|
|
| постоянный участник
|
Сообщение: 87
Зарегистрирован: 02.01.09
|
|
Отправлено: 21.03.14 22:33. Заголовок: Можно еще попробоват..
Можно еще попробовать в условии if написать if #%pass#count_1$$ ="abc2" then...
|
|
Профиль
Цитата
Ответить
|
|
| |
Сообщение: 29
Зарегистрирован: 23.11.12
|
|
Отправлено: 21.03.14 23:20. Заголовок: Попробовал, Акурка в..
Попробовал, Акурка вообще повисла :))) И не отвисала, пока я не выбил процесс
|
|
Профиль
Цитата
Ответить
|
|
| постоянный участник
|
Сообщение: 88
Зарегистрирован: 05.08.08
|
|
Отправлено: 23.03.14 23:16. Заголовок: Может, пригодится - ..
Может, пригодится - в игре "Пять верст" я сделал ввод текста через anykey. При этом разрешались только буквы, пробелы и знаки препинания просто игнорировались. А правильность ответа проверял посредством мэппинга. Поясню на примере: 1. Создаем ненулевую переменную, которая содержит правильный ответ: правильный_ответ_1_abc2 = 1 правильный_ответ_2_cde3 = 1 2. Допустим, результат содержится в переменной "результат". Выполняем проверку: if правильный_ответ_#count_1$_#%результат$ then pln Да. else pln Нет. Такая конструкция выдаст "Да" если (count_1=1 и результат="abc2") или (count_1=2 и результат="cde3"); и "Нет." во всех остальных случаях. Если что не понятно, могу объяснить подробнее.
|
|
Профиль
Цитата
Ответить
|
|
| |
Сообщение: 30
Зарегистрирован: 23.11.12
|
|
Отправлено: 28.03.14 22:26. Заголовок: Всем привет! Наконец..
Всем привет! Наконец-то додумался как это организовать: :1 pln введите пароль: instr pass1= input pass1 aim="abc2" if pass#count_1$==aim then pln есть& else pln нет end т.е. делаем дополнительную переменную, в которой хранится правильный ответ. Теперь выше описанный участок кода работает нормально. Продолжаю игру дальше - опять незадача. Вот пример конструкции: input maxteamnum cls if maxteamnum=="[!0-9]" or len(maxteamnum)=0 or not maxteamnum=abs(maxteamnum) or #maxteamnum-50$>0 then maxteamnum=7&pln ВНИМАНИЕ: ВВЕДЕНО НЕКОРРЕКТНОЕ ЗНАЧЕНИЕ НАСТРОЙКИ! Переменной присвоено значение по умолчанию (7). Если хотите изменить данную настройку, нажмите "Назад" и укажите число, удовлетворяющее требованиям.&xbtn settings,{set_setstep=set_setstep-1}, Назад&btn settings, Далее&end& else pln Установлено: #maxteamnum$. Как вы понимаете, здесь задаётся ввод значения переменной (maxteamnum), а затем введённая инфа аналезируется фильтром на предмет корректности: - Если введённый текст содержит символ(ы), не являющиеся цифрой, на экран выводится текст предупреждения и соответствующие кнопки (с этими операторами проблем нет). - Конструкция так же заблокирует и абсолютно пустую строку (длина которой равна 0). - Следующая часть условия проверяет, не представляет ли из себя текст отрицательное число. Акурка, к сожалению, не поддерживает прямое сравнение текстовых переменных по средствам знаков < и >, поэтому пришлось немного схитрить: Так как модуль числа всегда положителен, то если число не равно собственному модулю, то оно отрицательное. - Четвёртое условие проверяет, не привосходит ли введённое значение своего предельно допустимого в игре максимума (50) - если maxteamnum -50 будет больше нуля, то maxteamnum больше 50. Вроде бы всё выглядит довольно-таки чистенько и работоспособно. Но на практике - опять та же селёдка, что была с паролем! Ввожу я число 50, а мне выдаётся предупреждение а некорректности и предлагается ввести другое значение. Вот я и прошу вас помочь мне понять, где же тут собака зарыта! Заранее благодарю!
|
|
Профиль
Цитата
Ответить
|
|
| постоянный участник
|
Сообщение: 39
Зарегистрирован: 17.02.10
|
|
Отправлено: 28.03.14 22:49. Заголовок: Вот тебе информация ..
Вот тебе информация к размышлению :1 pln #count_1$ pln введите пароль: instr pass1= input pass1 aim="serg" if pass#count_1$=aim then pln есть& else pln нет pln btn 1, Refresh! end У меня заработало...
|
|
Профиль
Цитата
Ответить
|
|
| |
Сообщение: 33
Зарегистрирован: 23.11.12
|
|
Отправлено: 29.03.14 14:38. Заголовок: apromix пишет: Цита..
apromix пишет: Цитата: У меня заработало... У меня тоже (см. моё предыдущее сообщение). Наверное мы печатали одновременно )))
|
|
Профиль
Цитата
Ответить
|
|
| постоянный участник
|
Сообщение: 90
Зарегистрирован: 05.08.08
|
|
Отправлено: 29.03.14 23:28. Заголовок: Регулярные выражения..
Регулярные выражения в урке не поддерживаются.
|
|
Профиль
Цитата
Ответить
|
|
|
| |
Сообщение: 35
Зарегистрирован: 23.11.12
|
|
Отправлено: 30.03.14 15:54. Заголовок: Frodo пишет: Цитата..
Frodo пишет: Цитата: Регулярные выражения в урке не поддерживаются. Это как так? Выходит документация по Акурке написана неправильно? И вообще, как тогда на Урке возможно создавать парсеры или по крайней мере что-то к ним приближённое? Или возможно я просто не совсем понимаю термин "Регулярные выражения". Вы хотите сказать, что операции с текстовыми переменными в Урке вообще не возможны?
|
|
Профиль
Цитата
Ответить
|
|
| постоянный участник
|
Сообщение: 88
Зарегистрирован: 02.01.09
|
|
Отправлено: 30.03.14 17:24. Заголовок: Prime, вижу проблему..
Prime, вижу проблему в этом участке кода: цитата: | if maxteamnum=="[!0-9]" or len(maxteamnum)=0 or not maxteamnum=abs(maxteamnum) or #maxteamnum-50$>0 |
| В первом (с ==) и втором (с len) условии maxteamnum рассматривается, как строковая переменная, во всех остальных - как числовая. Моя гипотеза - для числовой переменной (а судя по предыдущему коду, maxteamnum считается таковой, если только где-то не было объявлено ее инициализации с instr) возвращаемое значение строковой длины (len) всегда будет равно нулю. Вам надо проинициализиовать maxteamnum как строковую переменную, потом каким-то образом сконвертить ее в числовую и у этой числовой уже проверять значения. Подробный пример кода продемонстрировать сейчас не готова.
|
|
Профиль
Цитата
Ответить
|
|
| |
Сообщение: 36
Зарегистрирован: 23.11.12
|
|
Отправлено: 30.03.14 21:10. Заголовок: Veto, я проверил зна..
Veto, я проверил значение переменной len(maxteamnum). В случае с числом 49 или 50 (на других не пробовал) оно равно двум! Как собственно и надо. Судя по всему проблема не в конвертации типа переменной. Здесь, думаю, что-то из разряда особых тонкостей языка URQ (или возможно даже самой Акурки).
|
|
Профиль
Цитата
Ответить
|
|
| постоянный участник
|
Сообщение: 89
Зарегистрирован: 02.01.09
|
|
Отправлено: 30.03.14 23:30. Заголовок: Prime пишет: Veto, ..
Prime пишет: цитата: | Veto, я проверил значение переменной len(maxteamnum). В случае с числом 49 или 50 (на других не пробовал) оно равно двум! Как собственно и надо. Судя по всему проблема не в конвертации типа переменной. Здесь, думаю, что-то из разряда особых тонкостей языка URQ (или возможно даже самой Акурки). |
| Это говорит только о том, что maxteamnum воспринимается как строковая переменная. Я бы тестировала так: 1. Убрала бы из исходного if условия, интерпретирующие maxteamnum как числовую переменную (not maxteamnum=abs(maxteamnum) or #maxteamnum-50$>0). Проверила бы, как отрабатываются нештатные варианты - ввод пустой строки, наличие отличных от чисел символов в строке. (Кстати, условие maxteamnum=="[!0-9]", по идее, должно и отрицательные числа отсекать, так что дальнейшая проверка тут вроде и не нужна. Но это так, к слову). 2. Если в п. 1 все работает, как ожидается, я бы уже после if-а добавила вычисления abs(maxteamnum) и #maxteamnum-50$ и посмотрела бы, правильно ли они отрабатывают. Если нет, то, значит, автоматической конвертации строкового значения в число не происходит, и надо это сделать принудительно в программе. Если же все нормально, то поэкспериментировала бы еще с присваиванием значений промежуточным переменным и использованием в операторе if именно этих переменных, а не оригинальных значений.
|
|
Профиль
Цитата
Ответить
|
|
| |
Сообщение: 38
Зарегистрирован: 23.11.12
|
|
Отправлено: 01.04.14 17:39. Заголовок: Спасибо, Veto, попро..
Спасибо, Veto, попробую.
|
|
Профиль
Цитата
Ответить
|
|
| постоянный участник
|
Сообщение: 91
Зарегистрирован: 05.08.08
|
|
Отправлено: 02.04.14 09:52. Заголовок: frodo пишет: Регуля..
frodo пишет: цитата: | Регулярные выражения в урке не поддерживаются. |
| Прошу прощения, забыл, что мы говорим об АкУрке. Prime пишет: цитата: | if maxteamnum=="[!0-9]" or len(maxteamnum)=0 or not maxteamnum=abs(maxteamnum) or #maxteamnum-50$>0 then maxteamnum=7 ... |
| Я уже советовал ранее: pln - чуть ли не единственный способ отладки. Можно проверить, как работает код, если разбить его на составляющие. Например, так: incorrect1=0 incorrect2=0 incorrect3=0 incorrect4=0 if maxteamnum=="[!0-9]" then incorrect1=1 if len(maxteamnum)=0 then incorrect2=1 if not maxteamnum=abs(maxteamnum) then incorrect3=1 if #maxteamnum-50$>0 then incorrect4=1 pln Step 1: #incorrect1$, step 2: #incorrect2$, step 3: #incorrect3$, step 4: #incorrect4$ if incorrect1 or incorrect2 or incorrect3 or incorrect4 then maxteamnum=7 ... Впоследствии код можно не менять, только закомментировать pln.
|
|
Профиль
Цитата
Ответить
|
Новых ответов нет
, стр:
1
2
All
[см. все]
|
|