Quant Автор темы 442 Опубликовано: 8 июля, 2015 (изменено) Теперь прога работает ещё быстрее - числа в 14 цифр из девяток(99999999999999) передаются 14*9*2 тиков - это 13 с половиной секунд! Мир лагал,но это число передалось за минуту. Изменено 8 июля, 2015 пользователем Quant Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 148 Опубликовано: 8 июля, 2015 Теперь прога работает ещё быстрее - числа в 14 цифр из девяток(99999999999999) передаются 14*9*2 тиковХороший результат, ты близок к успеху, но есть возможность передать твое число в 20 раз быстрее. Почему ты не захотел разложить число в пятнадцатеричный ряд и вместо синхронизирующего нуля передать что-нибудь более ценное? И еще проясни смысл вот этой строки в конце принимающей части print((l-l%10)/10) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Quant Автор темы 442 Опубликовано: 8 июля, 2015 Хороший результат, ты близок к успеху, но есть возможность передать твое число в 20 раз быстрее. Почему ты не захотел разложить число в пятнадцатеричный ряд и вместо синхронизирующего нуля передать что-нибудь более ценное?И еще проясни смысл вот этой строки в конце принимающей части print((l-l%10)/10) Целочисленное деление-3:2=1 вместо 1,5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 148 Опубликовано: 8 июля, 2015 (изменено) Целочисленное деление Синтаксис Lua не вызывает вопросов. Главный вопрос - зачем. Кстати, в коде присутствует еще один странный момент. Приведу краткую выдержку и добавлю свою комментарии. Предполагаю, что дело здесь в неправильном использовании числового типа, но я хочу понять, как ты пришел к такому решению, т.к. есть в этом коде что-то очень неправильное. -- в цикле передатчика: l = l - 10^(n-1) -- в цикле приемника: l = l +10^ (r.getInput(s.left)-1) if r.getInput(s.left)==1 then l=l+1-0.1 -- зачем ты что-то добавляешь к результату? -- вывод результата приемника print((l-l%10)/10) -- зачем делишь его на 10?Upd: Погуглил числовой тип в Lua. Четырнадцать девяток вообще не должны вызывать какого-либо переполнения. Так что, я не понимаю происходящее в коде. Присутствуют как минимум три странности:1) Какое-то деление результата на 10; 2) Добавление к результату 0.9 в тех циклах, когда уже было добавлено 1.0, т.е. 9 раз; 3) Добавление к результату 0.1 во всех циклах, т.е. в твоем случае 14*9 раз. Quant, ты хотя бы проверял работу своего кода? Что выводил приемник? Изменено 8 июля, 2015 пользователем eu_tomat Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Quant Автор темы 442 Опубликовано: 9 июля, 2015 А,это осталось после исправления ошибок,eu_tomat,и if r.getInput(s.left)==1 then l=l+1-0.1 никогда не выполняется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 148 Опубликовано: 9 июля, 2015 А разве передатчик никогда не выдает единицу? Хотя, нет. Спрошу иначе. Почему твой передатчик никогда не выдает единицу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Quant Автор темы 442 Опубликовано: 9 июля, 2015 А разве передатчик никогда не выдает единицу? Хотя, нет. Спрошу иначе. Почему твой передатчик никогда не выдает единицу? По той же причине, откуда там дроби в другом варианте кода,хотя там нет делений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 148 Опубликовано: 9 июля, 2015 По той же причине, откуда там дроби в другом варианте кода,хотя там нет делений.Ты на каком языке пишешь? По-русски скажи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Quant Автор темы 442 Опубликовано: 9 июля, 2015 Ты на каком языке пишешь? По-русски скажи. передаю 93 - получается 94.3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 148 Опубликовано: 9 июля, 2015 (изменено) передаю 93 - получается 94.3Естественно. Я же тебе говорю, у тебя в каждом цикле добавляется 0.1 А циклов у тебя 9+4 = 13. Поэтому 93 + 0.1*(9+4) = 94.3 И для того, чтобы решить проблему, следует не подгонять результат, добавляя 0.9, и не умножать в передатчике на 10, а потом в приемнике делить, чтобы убрать ошибку, т.к. не понимая природы накопления ошибки, ты не можешь оценить и ее размер. Надо просто найти причину накопления ошибки и устранить ее. Изменено 9 июля, 2015 пользователем eu_tomat Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Quant Автор темы 442 Опубликовано: 9 июля, 2015 Естественно. Я же тебе говорю, у тебя в каждом цикле добавляется 0.1 А циклов у тебя 9+4 = 13. Поэтому 93 + 0.1*(9+4) = 94.3 И для того, чтобы решить проблему, следует не подгонять результат, добавляя 0.9, и не умножать в передатчике на 10, а потом в приемнике делить, чтобы убрать ошибку, т.к. не понимая природы накопления ошибки, ты не можешь оценить и ее размер. Надо просто найти причину накопления ошибки и устранить ее. в этой версии кода: local symtime = 0.05 local maxreqtime = 2 --Максимальное время синхронизации local c = require("component") local s = require("sides") local r = c.redstone local l = tonumber(io.read()) os.sleep(maxreqtime - (os.time()%maxreqtime)+1) while l>0 do --print(l) if l>99999999999999 then n=15 elseif l>9999999999999 then n=14 elseif l>999999999999 then n=13 elseif l>99999999999 then n=12 elseif l>9999999999 then n=11 elseif l>999999999 then n=10 elseif l>99999999 then n=9 elseif l>9999999 then n=8 elseif l>999999 then n=7 elseif l>99999 then n=6 elseif l>9999 then n=5 elseif l>999 then n=4 elseif l>99 then n=3 elseif l>9 then n=2 else n=1 end; l = l - 10^(n-1) r.setOutput(s.right,n) os.sleep(symtime) r.setOutput(s.right,0) os.sleep(symtime) end; local e = require("event") local c = require("component") local s = require("sides") local r = c.redstone local l = 0 local t = 15 local b = false function f() t=3 print(r.getInput(s.left)) l = l +10^ (r.getInput(s.left)-1) --if r.getInput(s.left)==1 then b=true end; end; e.listen("redstone_changed",f) while t>0 do os.sleep(1) t = t - 1 end; if b then l=l-1 end; print(l) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 148 Опубликовано: 9 июля, 2015 в этой версии кода:Да, именно в этой, когда ты еще не понаставил костылей. Правда, здесь тоже какой-то мусор в виде "if b then l=l-1 end;", но не будем о нем. В каждом цикле у тебя неявно добавляется 0.1 к результату. Вот, ответь мне, сколько у тебя выполняется циклов передачи при пересылке числа 93? И сколько раз вызывается событие изменения редстоуна в приемнике? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Quant Автор темы 442 Опубликовано: 9 июля, 2015 Да, именно в этой, когда ты еще не понаставил костылей. Правда, здесь тоже какой-то мусор в виде "if b then l=l-1 end;", но не будем о нем. В каждом цикле у тебя неявно добавляется 0.1 к результату. Вот, ответь мне, сколько у тебя выполняется циклов передачи при пересылке числа 93? И сколько раз вызывается событие изменения редстоуна в приемнике? 12 раз,событие - 24раза Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 148 Опубликовано: 9 июля, 2015 12 раз,событие - 24разаОтлично. Теперь скажи, сколько раз происходит суммирование полученных данных в результирующую переменную? И что именно суммируется? Если сложно считать в уме, можешь добавить print в обработчик события. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Quant Автор темы 442 Опубликовано: 10 июля, 2015 Отлично. Теперь скажи, сколько раз происходит суммирование полученных данных в результирующую переменную? И что именно суммируется? Если сложно считать в уме, можешь добавить print в обработчик события. 10+0+10+0+10+0+10+0+10+0+10+0+10+0+10+0+10+0+1+0+1+0+1+0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 148 Опубликовано: 10 июля, 2015 10+0+10+0+10+0+10+0+10+0+10+0+10+0+10+0+10+0+1+0+1+0+1+0 Это ты в уме посчитал, но кое-чего не учел. Для начала перепиши обработчик события в удобоваримый вид. Например: local inp = r.getInput(input_side) local add = 10^(inp-1) res = res + add print( inp,add,res ) И посмотри на вывод. Fingercomp, опередил меня. Зря ты сказал. Пусть поучился бы отладке кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 397 Опубликовано: 10 июля, 2015 Fingercomp, опередил меня. Зря ты сказал. Пусть поучился бы отладке кода. ОК, к счастью, Квант это сообщение не увидел (был в оффлайне), так что успел скрыть) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Quant Автор темы 442 Опубликовано: 11 июля, 2015 ОК, к счастью, Квант это сообщение не увидел (был в оффлайне), так что успел скрыть) Ах тыж подлец Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 148 Опубликовано: 11 июля, 2015 Ах тыж подлецQuant, для тебя же стараемся, помогаем тебе научиться, а ты только флудишь во всех темах. Посмотри наконец на то, что выведет обработчик события. И без слов Фигнера уже сколько намеков было. Он-то уже разжевал до невозможности, лишь бы ты побыстрее закончил. Сам немного пожуй, дружище, а то зубы не окрепнут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
swg2you 403 Опубликовано: 12 июля, 2015 Quant, для тебя же стараемся, помогаем тебе научиться, а ты только флудишь во всех темах. Посмотри наконец на то, что выведет обработчик события. И без слов Фигнера уже сколько намеков было. Он-то уже разжевал до невозможности, лишь бы ты побыстрее закончил. Сам немного пожуй, дружище, а то зубы не окрепнут. Во-во, а то развелось беззубых ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах