Автор Тема: Инкремент переменной  (Прочитано 579 раз)

Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 89
  • Репутация: +7/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Инкремент переменной
« : Июнь 30, 2016, 03:58:51 pm »
Всем привет! Есть такой код
{$CLEO}
0000:
thread 'func'
wait 0

0@ = 0
while true
    wait 2000
    05F5: call_scm_func @Marker params_count 0
end

:Marker
    wait 0
    0@ += 5
    01E3: text_1number_styled 'REWARD' number 0@ time 1000 style 6
05F6: ret 0

end_thread
Запустив игру мы увидим, что функция выводит постоянно одно и то же значение. Хотелось бы узнать почему?

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичек
  • *****
  • Сообщений: 173
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Инкремент переменной
« Ответ #1 : Июнь 30, 2016, 04:51:42 pm »
Оно выводит одно и тоже так как ты не передаешь это значение в функцию. Короче говоря значение переменной сбрасывается на 0 что и должно быть при использование не переданной переменной в функцию.
I know everything and nothing...

Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 89
  • Репутация: +7/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Re: Инкремент переменной
« Ответ #2 : Июнь 30, 2016, 05:55:57 pm »
Оно выводит одно и тоже так как ты не передаешь это значение в функцию. Короче говоря значение переменной сбрасывается на 0 что и должно быть при использование не переданной переменной в функцию.
Странно. Обычно во всех языках программирования, в интерпретируемых, скриптовых как LUA, функции могут получить доступ к глобальным переменным, (имею в виду глобальную переменную относительно сценария) явно не обращаясь к ней.

Кстати, а в Cleo есть понятие области видимости? То есть, например, если объявить переменную внутри функции, то будет ли она доступна изнутри?
« Последнее редактирование: Июнь 30, 2016, 06:17:15 pm от Prographer »

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичек
  • *****
  • Сообщений: 173
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Инкремент переменной
« Ответ #3 : Июль 01, 2016, 03:03:48 am »
call_scm_func так устроена что внутри нее все переменные там и оcтаются если ты их оттуда либо не вытащишь либо не передашь в нее для этого можно использовать синтаксис. Скажем вот так.

call_scm_func @Marker params_count 1 0@

...

:Marker
    wait 0
    0@ += 5
    01E3: text_1number_styled 'REWARD' number 0@ time 1000 style 6
ret 1 0@
В этом случае переменная как передается так и отдается но учти что тут есть одна особенность. Сами переменные передаются по порядку.
Например

5@ = 4
9@ = 11.0

call_scm_func @Primer params_count 2 5@ 9@

...

:Primer

//здесь уже в переменной 0@ будет 4 а в переменной 1@ будет 11.0.
//если ты захочешь вывести переменные то надо сделать вот так
ret 2 0@ 1@ // ну или вот так ret 2 1@ 0@ но тогда в самом объявлении функции надо написать
//call_scm_func @Primer 2 5@ 9@ 5@ 9@ либо call_scm_func @Primer 2 5@ 9@ 9@ 5@ если ты передал как ret 2 1@ 0@
« Последнее редактирование: Июль 01, 2016, 04:21:44 am от mfisto »
I know everything and nothing...

Оффлайн Shagg_E

  • Опытный
  • **
  • Сообщений: 480
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Инкремент переменной
« Ответ #4 : Июль 01, 2016, 11:41:58 am »
Prographer> Короче, если нужна экономия переменных(если в функции должны быть какие-то дополнительные вычисления, связанные с использованием большого числа переменных) - используй scm функцию, как написал mfisto. Если нет, и функция нужна лишь для лаконичности кода - используй gosub:
{$CLEO}
0000:
thread 'func'
wait 0

0@ = 0
while true  // Правда, я не понимаю смысл вот этого - тут же нет условий
    wait 2000
    gosub @Marker
end
end_thread

:Marker
    wait 0
    0@ += 5
    01E3: text_1number_styled 'REWARD' number 0@ time 1000 style 6
return
« Последнее редактирование: Июль 01, 2016, 11:44:41 am от Shagg_E »

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичек
  • *****
  • Сообщений: 173
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Инкремент переменной
« Ответ #5 : Июль 01, 2016, 03:12:48 pm »
Цикл
while true
...
end
используется как вечный цикл
если написать
while false
end
цикл никогда не выполнится, что есть просто как факт.
При декомпиляции вида while true будет типа
:noname
...
jump @noname
I know everything and nothing...

Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 89
  • Репутация: +7/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Re: Инкремент переменной
« Ответ #6 : Июль 01, 2016, 06:38:59 pm »
Prographer> Короче, если нужна экономия переменных(если в функции должны быть какие-то дополнительные вычисления, связанные с использованием большого числа переменных) - используй scm функцию, как написал mfisto. Если нет, и функция нужна лишь для лаконичности кода - используй gosub:
{$CLEO}
0000:
thread 'func'
wait 0

0@ = 0
while true  // Правда, я не понимаю смысл вот этого - тут же нет условий
    wait 2000
    gosub @Marker
end
end_thread

:Marker
    wait 0
    0@ += 5
    01E3: text_1number_styled 'REWARD' number 0@ time 1000 style 6
return
Смысл просто в том, чтобы продемонстрировать, что функция не работает. Сейчас, когда mfisto объяснил почему так происходит, код конечно кажется бессмысленным.
По поводу функций также хотелось бы сказать, что они позволяют сделать скрипт не только лаконичным, но и функциональным. У меня, помнится, даже когда-то была идея сделать своеобразный фреймворк на Cleo, чтобы можно было заменить написание большого количества однотипных операций одной функцией. Допустим, рисования спрайтов или создание системы частиц.

Оффлайн Shagg_E

  • Опытный
  • **
  • Сообщений: 480
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Инкремент переменной
« Ответ #7 : Июль 02, 2016, 06:22:33 am »
аа ясн