Перейти к содержимому
Quant

Передача данных по рэдстоуну

Рекомендуемые сообщения

Теперь прога работает ещё быстрее - числа в 14 цифр из девяток(99999999999999) передаются 14*9*2 тиков - это 13 с половиной секунд!

Мир лагал,но это число передалось за минуту.

Изменено пользователем Quant

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Теперь прога работает ещё быстрее - числа в 14 цифр из девяток(99999999999999) передаются 14*9*2 тиков

Хороший результат, ты близок к успеху, но есть возможность передать твое число в 20 раз быстрее. Почему ты не захотел разложить число в пятнадцатеричный ряд и вместо синхронизирующего нуля передать что-нибудь более ценное?

И еще проясни смысл вот этой строки в конце принимающей части

print((l-l%10)/10)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Хороший результат, ты близок к успеху, но есть возможность передать твое число в 20 раз быстрее. Почему ты не захотел разложить число в пятнадцатеричный ряд и вместо синхронизирующего нуля передать что-нибудь более ценное?И еще проясни смысл вот этой строки в конце принимающей части

 

print((l-l%10)/10)
Целочисленное деление-

3:2=1 вместо 1,5

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Целочисленное деление

 

Синтаксис 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, ты хотя бы проверял работу своего кода? Что выводил приемник?

Изменено пользователем eu_tomat

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А,это осталось после исправления ошибок,eu_tomat,и if r.getInput(s.left)==1 then l=l+1-0.1 никогда не выполняется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А разве передатчик никогда не выдает единицу?

Хотя, нет. Спрошу иначе. Почему твой передатчик никогда не выдает единицу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А разве передатчик никогда не выдает единицу?

Хотя, нет. Спрошу иначе. Почему твой передатчик никогда не выдает единицу?

По той же причине, откуда там дроби в другом варианте кода,хотя там нет делений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

По той же причине, откуда там дроби в другом варианте кода,хотя там нет делений.

Ты на каком языке пишешь? По-русски скажи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ты на каком языке пишешь? По-русски скажи.

передаю 93 - получается 94.3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

передаю 93 - получается 94.3

Естественно. Я же тебе говорю, у тебя в каждом цикле добавляется 0.1

А циклов у тебя 9+4 = 13.

Поэтому 93 + 0.1*(9+4) = 94.3

 

И для того, чтобы решить проблему, следует не подгонять результат, добавляя 0.9, и не умножать в передатчике на 10, а потом в приемнике делить, чтобы убрать ошибку, т.к. не понимая природы накопления ошибки, ты не можешь оценить и ее размер.

 

Надо просто найти причину накопления ошибки и устранить ее.

Изменено пользователем eu_tomat

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Естественно. Я же тебе говорю, у тебя в каждом цикле добавляется 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)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

в этой версии кода:

Да, именно в этой, когда ты еще не понаставил костылей.

Правда, здесь тоже какой-то мусор в виде "if b then l=l-1 end;", но не будем о нем.

В каждом цикле у тебя неявно добавляется 0.1 к результату.

 

Вот, ответь мне, сколько у тебя выполняется циклов передачи при пересылке числа 93?

И сколько раз вызывается событие изменения редстоуна в приемнике?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, именно в этой, когда ты еще не понаставил костылей.

Правда, здесь тоже какой-то мусор в виде "if b then l=l-1 end;", но не будем о нем.

В каждом цикле у тебя неявно добавляется 0.1 к результату.

 

Вот, ответь мне, сколько у тебя выполняется циклов передачи при пересылке числа 93?

И сколько раз вызывается событие изменения редстоуна в приемнике?

12 раз,событие - 24раза

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

12 раз,событие - 24раза

Отлично. Теперь скажи, сколько раз происходит суммирование полученных данных в результирующую переменную?

И что именно суммируется?

Если сложно считать в уме, можешь добавить print в обработчик события.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Отлично. Теперь скажи, сколько раз происходит суммирование полученных данных в результирующую переменную?

И что именно суммируется?

Если сложно считать в уме, можешь добавить 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах


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, опередил меня. Зря ты сказал. Пусть поучился бы отладке кода.

ОК, к счастью, Квант это сообщение не увидел (был в оффлайне), так что успел скрыть)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ОК, к счастью, Квант это сообщение не увидел (был в оффлайне), так что успел скрыть)

Ах тыж подлец:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ах тыж подлец

Quant, для тебя же стараемся, помогаем тебе научиться, а ты только флудишь во всех темах.

Посмотри наконец на то, что выведет обработчик события. И без слов Фигнера уже сколько намеков было. Он-то уже разжевал до невозможности, лишь бы ты побыстрее закончил. Сам немного пожуй, дружище, а то зубы не окрепнут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Quant, для тебя же стараемся, помогаем тебе научиться, а ты только флудишь во всех темах.

Посмотри наконец на то, что выведет обработчик события. И без слов Фигнера уже сколько намеков было. Он-то уже разжевал до невозможности, лишь бы ты побыстрее закончил. Сам немного пожуй, дружище, а то зубы не окрепнут.

Во-во, а то развелось беззубых )

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...