Переменные

James Hawk

Известный
Автор темы
919
217
Уже не впервые сталкиваюсь со случаями, когда необходимо изменить оглашенную глобальную переменную в какой-либо функции и затем в другой функции работать с этим значением.
Но значение воспринимается иначе.

Пример:
Lua:
local a = 0

function main()
   -- code
   print(a)  -- a = 0
end

function smth()
   -- code
   a = 5
end

Кроме того, ознакамливался с разного рода исходниками, где люди подобные вещи делают с переменными (и всё у них без косяков). Какие варианты решения?
 

Yuan

Участник
77
26
Уже не впервые сталкиваюсь со случаями, когда необходимо изменить оглашенную глобальную переменную в какой-либо функции и затем в другой функции работать с этим значением.
Но значение воспринимается иначе.

Пример:
Lua:
local a = 0

function main()
   -- code
   print(a)  -- a = 0
end

function smth()
   -- code
   a = 5
end

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

Lua:
local a = 0

function main()
   -- code
   smth()
   print(a)  -- "5"
end

function smth()
   -- code
   a = 5
end
 

James Hawk

Известный
Автор темы
919
217
Пример
Lua:
hun = 0
--------------------
-- main
while true do
        wait(0)
     
        if wasKeyPressed(key.VK_Z) then
            local param = tonumber(false and (100 - math.floor(hun/54.5)*100 or math.floor(hun/54.5)*100))
            sampAddChatMessage(param, -1)
        end
end
-----------------
function onReceiveRpc(id, bs)
    if id == 134 then
        local data = {}
        data.id = raknetBitStreamReadInt16(bs)
        raknetBitStreamIgnoreBits(bs, 104)
        data.hun = raknetBitStreamReadFloat(bs) - 549.5
        raknetBitStreamIgnoreBits(bs, 32)
        data.color = raknetBitStreamReadInt32(bs)
        raknetBitStreamIgnoreBits(bs, 64)
        data.x = raknetBitStreamReadFloat(bs)
        data.y = raknetBitStreamReadFloat(bs)
        if data.x == textdraw[0] and data.y == textdraw[1] and data.color == textdraw[2] then
            hun = data.hun
        end
    end
end
Выводится пустая переменная param
 

Yuan

Участник
77
26
Пример
Lua:
hun = 0
--------------------
-- main
while true do
        wait(0)
    
        if wasKeyPressed(key.VK_Z) then
            local param = tonumber(false and (100 - math.floor(hun/54.5)*100 or math.floor(hun/54.5)*100))
            sampAddChatMessage(param, -1)
        end
end
-----------------
function onReceiveRpc(id, bs)
    if id == 134 then
        local data = {}
        data.id = raknetBitStreamReadInt16(bs)
        raknetBitStreamIgnoreBits(bs, 104)
        data.hun = raknetBitStreamReadFloat(bs) - 549.5
        raknetBitStreamIgnoreBits(bs, 32)
        data.color = raknetBitStreamReadInt32(bs)
        raknetBitStreamIgnoreBits(bs, 64)
        data.x = raknetBitStreamReadFloat(bs)
        data.y = raknetBitStreamReadFloat(bs)
        if data.x == textdraw[0] and data.y == textdraw[1] and data.color == textdraw[2] then
            hun = data.hun
        end
    end
end
Выводится пустая переменная param
Попробуй через print узнать, что там вообще присваивается.
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,131
Пример
Lua:
hun = 0
--------------------
-- main
while true do
        wait(0)
    
        if wasKeyPressed(key.VK_Z) then
            local param = tonumber(false and (100 - math.floor(hun/54.5)*100 or math.floor(hun/54.5)*100))
            sampAddChatMessage(param, -1)
        end
end
-----------------
function onReceiveRpc(id, bs)
    if id == 134 then
        local data = {}
        data.id = raknetBitStreamReadInt16(bs)
        raknetBitStreamIgnoreBits(bs, 104)
        data.hun = raknetBitStreamReadFloat(bs) - 549.5
        raknetBitStreamIgnoreBits(bs, 32)
        data.color = raknetBitStreamReadInt32(bs)
        raknetBitStreamIgnoreBits(bs, 64)
        data.x = raknetBitStreamReadFloat(bs)
        data.y = raknetBitStreamReadFloat(bs)
        if data.x == textdraw[0] and data.y == textdraw[1] and data.color == textdraw[2] then
            hun = data.hun
        end
    end
end
Выводится пустая переменная param
Есть предположение, что ты просто не умеешь использовать тетрарные выражения в Lua.
Lua:
local param = tonumber(false and (100 - math.floor(hun/54.5)*100) or (math.floor(hun/54.5)*100))
У тебя всегда будет выводить первое условие, так как место false нужно подставлять переменную.
 

James Hawk

Известный
Автор темы
919
217
Есть предположение, что ты просто не умеешь использовать тетрарные выражения в Lua.
Lua:
local param = tonumber(false and (100 - math.floor(hun/54.5)*100) or (math.floor(hun/54.5)*100))
У тебя всегда будет выводить первое условие, так как место false нужно подставлять переменную.
Предложение неверное. Замена false на переменную здесь не решает

Немного видоизменил код для другого результата. Теперь переменная хоть и выводится, но всегда нулевая
Lua:
hun = 0
--------------------
-- main
while true do
        wait(0)
        if wasKeyPressed(key.VK_Z) then
            local param = tonumber(math.floor(hun/54.5)*100)
            sampAddChatMessage(param, -1)
        end
end
-----------------
function onReceiveRpc(id, bs)
    if id == 134 then
        local data = {}
        data.id = raknetBitStreamReadInt16(bs)
        raknetBitStreamIgnoreBits(bs, 104)
        data.hun = raknetBitStreamReadFloat(bs) - 549.5
        raknetBitStreamIgnoreBits(bs, 32)
        data.color = raknetBitStreamReadInt32(bs)
        raknetBitStreamIgnoreBits(bs, 64)
        data.x = raknetBitStreamReadFloat(bs)
        data.y = raknetBitStreamReadFloat(bs)
        if data.x == textdraw[1][1] and data.y == textdraw[1][2] and data.color == textdraw[1][3] then
            hun = data.hun
        end
    end
end
 
Последнее редактирование:
  • Нравится
Реакции: Seniosik

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,131
Предложение неверное. Замена false на переменную здесь не решает

Немного видоизменил код для другого результата. Теперь переменная хоть и выводится, но всегда нулевая
А может дело в твоей некомпетентности и делании поспешных выводов? Как видишь, все, что связано с тернарником, работает как нужно - можешь посчитать сам.
http://yapx.ru/v/D9T9Z
 

James Hawk

Известный
Автор темы
919
217

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,131
Может быть у меня другая проблема, не находишь?
Ты спросил почему param пустой - я исправил тебе тернарник и он стал выводить то, что должен. Если в твоем коде что-то не работает, то это уж по другой причине, а точного кода ты не дал - только пример. Так что поубавь чувство наглости и поблагодари за помощь, ну либо хотя бы не возникай. Что за отношение такое к тем, кто пытается помочь?
 

James Hawk

Известный
Автор темы
919
217
Ты спросил почему param пустой - я исправил тебе тернарник и он стал выводить то, что должен. Если в твоем коде что-то не работает, то это уж по другой причине, а точного кода ты не дал - только пример. Так что поубавь чувство наглости и поблагодари за помощь, ну либо хотя бы не возникай. Что за отношение такое к тем, кто пытается помочь?
1. Тернарник мне здесь не особо нужен
2. Пример и есть частью кода (замечу, нужной в этом вопросе частью кода). Остальные части кода никак не касаются даного вопроса
3. Суть изначально вопроса состоит в том, что выводится неверное значение переменной
4. Если ты перечитаешь комментарий #7, то увидишь строку "Теперь переменная хоть и выводится, но всегда нулевая". Там же я указал, что видоизменил код (если пересмотреть, ещё раз убеждаемся, что мне тернарное условие не нужно)
Ты помогаешь совсем не с тем, что нужно. Ты пытаешься мне тыкнуть обратно в тернарку. За что, собственно, я должен тебя благодарить?
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,131
1. Тернарник мне здесь не особо нужен
2. Пример и есть частью кода (замечу, нужной в этом вопросе частью кода). Остальные части кода никак не касаются даного вопроса
3. Суть изначально вопроса состоит в том, что выводится неверное значение переменной
4. Если ты перечитаешь комментарий #7, то увидишь строку "Теперь переменная хоть и выводится, но всегда нулевая". Там же я указал, что видоизменил код (если пересмотреть, ещё раз убеждаемся, что мне тернарное условие не нужно)
Ты помогаешь совсем не с тем, что нужно. Ты пытаешься мне тыкнуть обратно в тернарку. За что, собственно, я должен тебя благодарить?
1) Мною был исправлена достаточно важная часть кода, из-за которой у тебя было пустое значение. Ты сам писал об этом, а значит помощь с этой частью тебе тоже нужна была. После моего исправления тернарное выражение стало работать так, как должно было работать изначально, если бы не кривые скобки. А то, что ты видоизменил код, сделав это после того, как я дал ответ, не исключает того, что я оказал тебе какую-то помощь, потратив своё время.
2) Проверил код, сделав его примерно также, как это реализовал ты, и пришел к выводу, что переменная спокойно обновляется, а после спокойно выводится через обычный print и даже через тернарник, который ты решил убрать со своего кода. Логично, что проблема в твоей функции с получением RPC.
3) Как ты узнал размер битстрима, который нужно пропустить? Экстрасенс что-ли? Попробуй получать размерность, тогда всё должно работать.
 

trefa

Известный
Всефорумный модератор
2,097
1,231
После прочтения битстрима какое значение?

1) Мною был исправлена достаточно важная часть кода, из-за которой у тебя было пустое значение. Ты сам писал об этом, а значит помощь с этой частью тебе тоже нужна была. После моего исправления тернарное выражение стало работать так, как должно было работать изначально, если бы не кривые скобки. А то, что ты видоизменил код, сделав это после того, как я дал ответ, не исключает того, что я оказал тебе какую-то помощь, потратив своё время.
2) Проверил код, сделав его примерно также, как это реализовал ты, и пришел к выводу, что переменная спокойно обновляется, а после спокойно выводится через обычный print и даже через тернарник, который ты решил убрать со своего кода. Логично, что проблема в твоей функции с получением RPC.
3) Как ты узнал размер битстрима, который нужно пропустить? Экстрасенс что-ли? Попробуй получать размерность, тогда всё должно работать.
Можно быть и не экстрасенсом,чтоб рассчитать пропуск.