FireURQ Bugtracker - FireURQ
Просмотр подробностей проблемы
0000077FireURQинтерпретаторобщая2009-08-29 22:052009-09-05 10:49
Best 
fireton 
обычныймалаявсегда
закрытрешен 
1.0.6 
1.0.71.0.7 
0000077: Действия с длиной строки
Не уверен баг это или нет, но я получаю вот такой результат:

instr x=k
pln #%x$ #x$ #x+1$

>>k 1 1

Когда хочу получить такой:
>>k 1 2

Прав я или урка?
Нет прикрепленных меток.
история изменений
2009-08-29 22:05BestНовый инцидент
2009-08-29 22:05BestОтветственный => fireton
2009-08-30 00:02NoliteКомментарий добавлен: 0000092
2009-08-30 00:45firetonКомментарий добавлен: 0000093
2009-08-30 00:45firetonСостояниеновый => назначен
2009-08-30 00:45firetonЦелевая версия => 1.0.7
2009-08-30 01:08frodoКомментарий добавлен: 0000094
2009-08-30 01:09frodoКомментарий изменен: 0000094
2009-08-30 01:10frodoКомментарий изменен: 0000094
2009-08-30 01:18frodoКомментарий изменен: 0000094
2009-08-30 10:31BestКомментарий добавлен: 0000095
2009-08-30 10:55frodoКомментарий добавлен: 0000096
2009-08-31 17:23frodoКомментарий изменен: 0000096
2009-09-04 13:49frodoКомментарий изменен: 0000096
2009-09-04 16:16frodoКомментарий изменен: 0000096
2009-09-04 16:33firetonКомментарий добавлен: 0000104
2009-09-04 16:33firetonСостояниеназначен => отработан
2009-09-04 16:33firetonРешен в версии => 1.0.7
2009-09-04 16:33firetonРешениеоткрыт => решен
2009-09-05 10:49firetonСостояниеотработан => закрыт

Комментарии
(0000092)
Nolite   
2009-08-30 00:02   
Может, это прояснит ситуацию:

instr x=k
pln #%x$ #x$ # #x$+1$ #%x+1$

>>k 1 2 k
(0000093)
fireton   
2009-08-30 00:45   
Наверное, прав ты. Будем посмотреть.
(0000094)
frodo   
2009-08-30 01:08   
(изменен: 2009-08-30 01:18)
Конструкцию " #x+1$ " фурка и досурка обрабатывают одинаково. Разница только в том, что для фурки х=1 (длина строковой переменной), а для досурки х=0 (для любой строки). "1" в ответе фурки означает, что при сложении строковой и численой переменной строковая не изменилась (как и должно быть), и ее длина по-прежнему равна одному символу
А вот конструкцию #%x+1$ досурка не понимает (в отличие от фурки!), ей нужно что-то вроде

y = x + 1
pln #%y$

только тогда выводится "k". Так что, получается, фурка ведет себя даже лучше(?) досурки.

Права урка!

(0000095)
Best   
2009-08-30 10:31   
>pln #%x$ #x$ # #x$+1$ #%x+1$
про # #x$+1# я знаю, но это выглядит как-то нелепо, к тому же легко написать ##x$+1$, что вызовет ошибку

>при сложении строковой и численой переменной строковая не изменилась (как и должно быть), и ее длина по-прежнему равна одному символу
я ведь не пытаюсь изменить длину, я пытаюсь всего лишь вывести число равное длине плюс адин
(0000096)
frodo   
2009-08-30 10:55   
(изменен: 2009-09-04 16:16)
UPD: Давай по-порядку. Что происходит, если интерпретатор встречает "#x+1$" ?
1. Берет значение х. Как видно из программы, х = "k".
2. Складывает строку "k" с числовой константой 1. А как представить текстом число? Тут есть два варианта:
3а. Пустой строкой, как любую необъявленную переменную, т.е. имеем выражение "k" + "" = "k". Тогда длина строки "#x+1$" будет равна длине строки "k", т.е. единице.
3б. Соотв. символом, в нашем случае "1". Тогда да, x+1 = "k1", и его длина #x+1$ = len("k1") = 2. Но тогда и #x+2$ = len("k2") = 2; где len() - длина строки.
IMHO, результат программы -- это случай 3а. 3б. -- это бесполезный теоретический вариант.

UPD(2): А "длина строки плюс один" это #x$+1, заключенное в #$, т.е. ##x$+1$.

(0000104)
fireton   
2009-09-04 16:33   
Короче вот что. Решатель видел, что первое значение - строка и включал режим сложения строк. Второе значение он пытался тоже представить строкой. Но строковое представление числа - пустая строка (так в досурке). Поэтому результатом получалось первоначальное значение ("k").

Теперь режим сложения строк включается только в случае, если оба операнда - строки. В противном случае он включает режим сложения чисел. А числовое значение строки - всегда длина строки (в фурке). Поэтому результат будет правильный.