Author Topic: Формирование функций от переменных  (Read 7404 times)

0 Members and 5 Guests are viewing this topic.

gsukhado

  • Активный участник
  • ***
  • Posts: 104
    • View Profile
Формирование функций от переменных
« on: September 19, 2017, 11:34:43 PM »
День добрый.

Требуется задавать масштабируемые значения для переменных, т.е. чтобы координаты для формул прописывались не в явном виде, а как функция = ($x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch)) от координаты $x_ishodnoe

Вручную везде по тексту вводить конструкции типа
ldown($x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch),$y_gr+INT(($y_ishodnoe-$y_gr)*$y_peresch))

или
if ((pxl($x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch),$y_vert_chat)=4144959)&(pxl($x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch),$y_vert_chat+INT(4*$y_peresch))=12566527)&(pxl($x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch),$y_vert_chat+INT(17*$y_peresch))=12566527)&(pxl($x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch),$y_vert_chat+INT(48*$y_peresch))=16744319))

- просто замучаешься. Наверняка есть возможность задания подобных функций, чтобы можно было сокращать до примерно
ldown(функция($x_ishodnoe),функция($y_ishodnoe))
Но увы в описаниях не нашел. Если просто через обычную подпрограмму - то надо вводить какие-то дополнительные переменные чтобы вернуть рассчитанное значение... Явно я что-то в хэлпах не обнаружил? подскажите плз...

gsukhado

  • Активный участник
  • ***
  • Posts: 104
    • View Profile
Re: Формирование функций от переменных
« Reply #1 on: September 19, 2017, 11:49:11 PM »
Вот вроде нашел что-то похожее, правильным ли будет такое решение (сейчас не могу проверить на боевом алгоритме)?

Code: (clickermann) [Select]
sub(x_multi, $tmp_znach)
  $tmp_znach1=getvar($tmp_znach)
  setvar($tmp_znach, $x_gr+INT(($tmp_znach1-$x_gr)*$x_peresch)
end_sub

sub(y_multi, $tmp_znach)
  $tmp_znach1=getvar($tmp_znach)
  setvar($tmp_znach, $y_gr+INT(($tmp_znach1-$y_gr)*$y_peresch)
end_sub

// Основная программа

ldown(x_multi(253)),y_multi(133))


gsukhado

  • Активный участник
  • ***
  • Posts: 104
    • View Profile
Re: Формирование функций от переменных
« Reply #2 on: September 20, 2017, 12:41:53 AM »
Хорошо, если getvar / setvar совсем не к месту (да, я с таковыми ни разу еще не сталкивался), то и #include  абсолютно ни при чем - мне не надо прятать код, мне надо упростить код, когда почти в каждой строке я вынужден писать длинные выражения типа

if ((pxl($x_gr+INT((231-$x_gr)*$x_peresch),$y_vert_chat)=4144959)&(pxl($x_gr+INT((436-$x_gr)*$x_peresch),$y_vert_chat+INT(4*$y_peresch))=12566527)&(pxl($x_gr+INT((524-$x_gr)*$x_peresch),$y_vert_chat+INT(17*$y_peresch))=12566527)&(pxl($x_gr+INT((576-$x_gr)*$x_peresch),$y_vert_chat+INT(48*$y_peresch))=16744319))

я просто чисто технически где-то в скобках или знаках ошибусь.
И хочу его сократить до

if ((pxl(функция1(231),$y_vert_chat)=4144959)&(pxl(функция1(436),$y_vert_chat+функция2(4))=12566527)&(pxl(функция1(524),$y_vert_chat+функция2(17))=12566527)&(pxl(функция1(576)),$y_vert_chat+функция2(48))=16744319))
а сами "функция1" и "функция2" вынести например в подпрограмму или каким-то образом задать. Это обычные алгебраические функции.

Как это можно сделать?

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Формирование функций от переменных
« Reply #3 on: September 20, 2017, 02:01:55 AM »

Требуется задавать масштабируемые значения для переменных, т.е. чтобы координаты для формул прописывались не в явном виде, а как функция = ($x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch)) от координаты $x_ishodnoe

Но увы в описаниях не нашел. Если просто через обычную подпрограмму - то надо вводить какие-то дополнительные переменные чтобы вернуть рассчитанное значение... Явно я что-то в хэлпах не обнаружил? подскажите плз...

возможности написания собственных функций в км нет. были предложения добавить токую возможность, но увы...
http://crapware.aidf.org/forum/index.php?topic=2108.0

пробуй варианты что предложил kiril.

кстати, getvar и setvar когда добавили в функционал, я так до сих пор и не догнал зачем это нужно и где это применить   :D .


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Формирование функций от переменных
« Reply #4 on: September 20, 2017, 02:49:15 AM »
Хорошо, если getvar / setvar совсем не к месту (да, я с таковыми ни разу еще не сталкивался), то и #include  абсолютно ни при чем - мне не надо прятать код, мне надо упростить код, когда почти в каждой строке я вынужден писать длинные выражения типа

if ((pxl($x_gr+INT((231-$x_gr)*$x_peresch),$y_vert_chat)=4144959)&(pxl($x_gr+INT((436-$x_gr)*$x_peresch),$y_vert_chat+INT(4*$y_peresch))=12566527)&(pxl($x_gr+INT((524-$x_gr)*$x_peresch),$y_vert_chat+INT(17*$y_peresch))=12566527)&(pxl($x_gr+INT((576-$x_gr)*$x_peresch),$y_vert_chat+INT(48*$y_peresch))=16744319))


Как это можно сделать?

вот пример для твоего примера через тот же sub, попробуй. хотя и твоя длиннющая строка if не такая уж и страшная.

Code: (clickermann) [Select]
sub(func_ifpix, $coord, $n_hz, $color)
   IF(pxl($x_gr+INT(($coord-$x_gr)*$x_peresch),$y_vert_chat+INT($n_hz*$y_peresch)) = $color)
      $ret = 1
   else
      $ret = 0
   END_IF
end_sub

func_ifpix(231,0, 4144959)
$func_1 = $ret

func_ifpix(436,4, 12566527)
$func_2 = $ret

func_ifpix(524,17, 12566527)
$func_3 = $ret

func_ifpix(576,48, 16744319)
$func_4 = $ret


if($func_1 & $func_2 & $func_3 & $func_4)
   //действо 
end_if

вот сокращенно как это работает:
Code: (clickermann) [Select]
sub(func_abc, $A, $B, $C)
   IF($A + $B = $C)
      $ret = 1
   else
      $ret = 0
   END_IF
end_sub

func_abc(1,1, 2)
$func_1 = $ret

func_abc(2,2, 4)
$func_2 = $ret

func_abc(3,3, 6)
$func_3 = $ret

func_abc(4,4, 8)
$func_4 = $ret


if($func_1 & $func_2 & $func_3 & $func_4)
   print("верно")
else
   print("не верно")
end_if

halt

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Формирование функций от переменных
« Reply #5 on: September 20, 2017, 08:33:55 AM »
Можно поизвращаться и сделать замены  через #define.

(поделено на строки только для простоты восприятия на форуме!)

Code: (clickermann) [Select]
// было
IF(
    (pxl($x_gr+INT((231-$x_gr)*$x_peresch), $y_vert_chat)=4144959) &
    (pxl($x_gr+INT((436-$x_gr)*$x_peresch), $y_vert_chat + INT(4*$y_peresch))=12566527) &
    (pxl($x_gr+INT((524-$x_gr)*$x_peresch), $y_vert_chat + INT(17*$y_peresch))=12566527) &
    (pxl($x_gr+INT((576-$x_gr)*$x_peresch), $y_vert_chat + INT(48*$y_peresch))=16744319)
    )
END_IF
Code: (clickermann) [Select]
#define xgr(:$x_gr+INT((
#define )xgr:-$x_gr)*$x_peresch)

#define pery(:INT(
#define )pery:*$y_peresch)

// стало
IF(
    (pxl(xgr(231)xgr, $y_vert_chat)=4144959) &
    (pxl(xgr(436)xgr, $y_vert_chat + pery(4)pery:)=12566527) &
    (pxl(xgr(524)xgr, $y_vert_chat + pery(17)pery:)=12566527) &
    (pxl(xgr(576)xgr, $y_vert_chat + pery(48)pery:)=16744319)
    )
END_IF

но не везде это нужно. Не вижу большого смысла в какой-то замене INT(17*$y_peresch).
Если уж менять то сразу $y_vert_chat + INT(17*$y_peresch))
Code: (clickermann) [Select]
// стало 2
#define xgr(:$x_gr+INT((
#define )xgr:-$x_gr)*$x_peresch)

#define yverper(:$y_vert_chat + INT(
#define )yverper:*$y_peresch)

IF(
    (pxl(xgr(231)xgr, $y_vert_chat)=4144959) &
    (pxl(xgr(436)xgr, yverper(4)yverper)=12566527) &
    (pxl(xgr(524)xgr, yverper(17)yverper)=12566527) &
    (pxl(xgr(576)xgr, yverper(48)yverper)=16744319)
    )
END_IF


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Формирование функций от переменных
« Reply #6 on: September 20, 2017, 08:38:20 AM »
Нужно менять график  :)


gsukhado

  • Активный участник
  • ***
  • Posts: 104
    • View Profile
Re: Формирование функций от переменных
« Reply #7 on: September 20, 2017, 09:36:53 AM »
Теперь с #define понял идею, спасибо!!! :)

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Формирование функций от переменных
« Reply #8 on: September 20, 2017, 02:53:27 PM »
можно сразу отвечать фразой " Пишу ответ", а потом не спеша редактировать своё сообщение.  ;)
Почему я не додумался... Наверно, потому, что могу начать писать и не закончить  :D
Вспомним новое словечко "лайфхак" и занесем ответ туда.


tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Re: Формирование функций от переменных
« Reply #9 on: September 23, 2017, 06:11:13 PM »
Макросы, сабы, инклуды - это конечно здорово. Но первым делом надо бы было поинтересоваться - "Меняют ли переменные (из этих длинных строк) свои значения по ходу выполнения скрипта?". Нам же этого не сказали.
И если не меняют, то просто загнать вычисления типа "$x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch)" в переменные, после того, как они в последний раз получат свои значения. Для этого можно выбрать удобное место в скрипте.
Code: (clickermann) [Select]
// Строка для примера:
// if ((pxl($x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch),$y_vert_chat)=4144959)

$x = $x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch) // вычисления в переменную

IF(PXL($x, $y_vert_chat) = 4144959) // ...

Ничего нового, просто хочу заострить на этом ваше внимание, т.к. похоже этот важный момент незаслуженно упущен, поэтому можно напрасно полезть в дебри из макросов буквально на ровном месте.

tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Re: Формирование функций от переменных
« Reply #10 on: September 23, 2017, 10:57:58 PM »
[spoiler]
Макросы, сабы, инклуды - это конечно здорово. Но первым делом надо бы было поинтересоваться - "Меняют ли переменные (из этих длинных строк) свои значения по ходу выполнения скрипта?". Нам же этого не сказали.
И если не меняют, то просто загнать вычисления типа "$x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch)" в переменные, после того, как они в последний раз получат свои значения. Для этого можно выбрать удобное место в скрипте.
Code: (clickermann) [Select]
// Строка для примера:
// if ((pxl($x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch),$y_vert_chat)=4144959)

$x = $x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch) // вычисления в переменную

IF(PXL($x, $y_vert_chat) = 4144959) // ...

Ничего нового, просто хочу заострить на этом ваше внимание, т.к. похоже этот важный момент незаслуженно упущен, поэтому можно напрасно полезть в дебри из макросов буквально на ровном месте.
Нужно хоть название темы прочесть, а желательно всю ветку сообщений, прежде чем флудить в теме заострением внимания на ненужных и не интересных автору темы моментах.
[/spoiler]

Автор темы как раз и спрашивает - можно ли описать в скрипте функции, вызов которых можно было бы делать в коде, например вместо выражений условий IF(). Для того, чтобы вместо длинной строки вычислений, в коде были бы короткие вызовы функций.
По факту ему не нужны сами эти функции, а нужны результаты работы этих функций, то есть то, что они возвращают. Это должно было бы сделать код менее громоздким и более читабельным. Иными словами - требуется вместо длинных строк однотипных вычислений, вставлять в код короткие результаты этих вычислений, это в идеале.

Если представить, что все эти вычисления производятся в сценарии у автора всего ОДИН РАЗ (например при запуске скрипта вычисляются координаты плавающих окон, или каких-то опорных пикселей), то повторять эти вычисления, как минимум глупо. И даже если бы были такие функции, то размножать их в коде, вместо того чтобы использовать уже известный результат их работы, было бы не верно. Так или иначе функции вернули бы результаты своей работы в переменные. Так почему не убрать все обертки и сразу не поместить эти результаты в переменные?
Я специально оговорился, выделив в своем прошлом ответе условие, при котором такой подход сработает.

kiril, ты первым должен был уточнить этот момент, так как первым начал "помогать" автору темы, начав с этого...
К сожалению, это  бред, от полного непонимания того, что вы пытаетесь использовать.
попробуйте другие способы, автозамену кода например,
или #define Заменяет один текст на другой,
или #include Вставляет в это место содержимое текстового файла из папки проекта. Это позволяет "прятать" объемный код, повышая таким образом читаемость скрипта.
Да и ни каких особых мучений при написании кода который вам понятен и работоспособность которого можете проверить, быть не должно.

Так что задачу не понял как раз ты, а не я. И вместо того, чтобы понять, начал бездумно помогать автору темы размножать его вычисления в коде, предварительно переписав их макросами. Жесть же? ;D
Пойми, я не оспариваю решения предложенные до меня, там всё верно. Я предлагаю другое, самое очевидное решение, которое ВОЗМОЖНО было проигнорировано потому, что никто не уточнил детали задачи.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Формирование функций от переменных
« Reply #11 on: September 24, 2017, 02:24:25 AM »
Макросы, сабы, инклуды - это конечно здорово. Но первым делом надо бы было поинтересоваться - "Меняют ли переменные (из этих длинных строк) свои значения по ходу выполнения скрипта?". Нам же этого не сказали.
И если не меняют, то просто загнать вычисления типа "$x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch)" в переменные, после того, как они в последний раз получат свои значения. Для этого можно выбрать удобное место в скрипте.
Code: (clickermann) [Select]
// Строка для примера:
// if ((pxl($x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch),$y_vert_chat)=4144959)

$x = $x_gr+INT(($x_ishodnoe-$x_gr)*$x_peresch) // вычисления в переменную

IF(PXL($x, $y_vert_chat) = 4144959) // ...

Ничего нового, просто хочу заострить на этом ваше внимание, т.к. похоже этот важный момент незаслуженно упущен, поэтому можно напрасно полезть в дебри из макросов буквально на ровном месте.
а ведь ты прав, почему то до этого никто и не подумал об простейшем присваивании длинных вычислений в одну переменную  :( . выходные, не охота щяс делать как бы это выглядело. но всеже, скрипт был бы и понятен и сокращен без всяких там инклудов сабов и прочего.



если бы у меня такая ситуация возникла, то я бы конечно не заморачивался бы, оставил бы как есть, длинные строки вычисления и пох, лишь бы я понимал как это все работает.
« Last Edit: September 24, 2017, 02:28:35 AM by dramster »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Формирование функций от переменных
« Reply #12 on: September 24, 2017, 02:00:13 PM »
Если представить, что все эти вычисления производятся в сценарии у автора всего ОДИН РАЗ (например при запуске скрипта вычисляются координаты плавающих окон, или каких-то опорных пикселей), то повторять эти вычисления, как минимум глупо. И даже если бы были такие функции, то размножать их в коде, вместо того чтобы использовать уже известный результат их работы, было бы не верно. Так или иначе функции вернули бы результаты своей работы в переменные. Так почему не убрать все обертки и сразу не поместить эти результаты в переменные?
Я специально оговорился, выделив в своем прошлом ответе условие, при котором такой подход сработает.

kiril, ты первым должен был уточнить этот момент, так как первым начал "помогать" автору темы, начав с этого...
Я предлагаю другое, самое очевидное решение, которое ВОЗМОЖНО было проигнорировано потому, что никто не уточнил детали задачи.

Конечно об этом подумали в первую очередь. Но я проанализировав стиль которым описан вопрос предположил, что автор не клинический идиот и сам бы себе не добавлял ненужных вычислений. Будем верить в людей и описанный тобой вариант событий отметаем.
И будем надеяться, что не ошиблись  :).

Вопрос был есть ли функции и аналоги или нет. А начальный код, минимум как пример или частный случай.
И ответ дали: функций нет. Остальное как методы уменьшения видимого кода. Можно было и без них
« Last Edit: September 24, 2017, 02:06:14 PM by Vint »


tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Re: Формирование функций от переменных
« Reply #13 on: September 24, 2017, 07:49:09 PM »
...
Вопрос был есть ли функции и аналоги или нет. А начальный код, минимум как пример или частный случай.
И ответ дали: функций нет. Остальное как методы уменьшения видимого кода. Можно было и без них

Вот же вопрос... (я выделил фразы, которые считаю ключевыми в этом вопросе).
Хорошо, если getvar / setvar совсем не к месту (да, я с таковыми ни разу еще не сталкивался), то и #include  абсолютно ни при чем - мне не надо прятать код, мне надо упростить код, когда почти в каждой строке я вынужден писать длинные выражения типа

if ((pxl($x_gr+INT((231-$x_gr)*$x_peresch),$y_vert_chat)=4144959)&(pxl($x_gr+INT((436-$x_gr)*$x_peresch),$y_vert_chat+INT(4*$y_peresch))=12566527)&(pxl($x_gr+INT((524-$x_gr)*$x_peresch),$y_vert_chat+INT(17*$y_peresch))=12566527)&(pxl($x_gr+INT((576-$x_gr)*$x_peresch),$y_vert_chat+INT(48*$y_peresch))=16744319))

я просто чисто технически где-то в скобках или знаках ошибусь.
И хочу его сократить до

if ((pxl(функция1(231),$y_vert_chat)=4144959)&(pxl(функция1(436),$y_vert_chat+функция2(4))=12566527)&(pxl(функция1(524),$y_vert_chat+функция2(17))=12566527)&(pxl(функция1(576)),$y_vert_chat+функция2(48))=16744319))
а сами "функция1" и "функция2" вынести например в подпрограмму или каким-то образом задать. Это обычные алгебраические функции.

Как это можно сделать?

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

Ну ладно вы ломанули по бездорожью, вы то пропрете, вы подкованы и не один мануал искурили. А представьте как новички читающие ваши варианты за вами в дебри полезут. Босые - до первой крапивы. С макросами ведь код проще не станет и макросы сам код не изменят. Значит надо править сам код, а не вуалировать его и не прятать.

Вообще странно, что я тут вам это объясняю. Все всё прекрасно поняли. Сами то используете в таких случаях переменные... А такие переменные, которые получают свои значения один раз за весь сценарий, есть почти в каждом коде. И не надо быть Вангой и "анализировать стиль которым описан вопрос", чтобы понять, что такие переменные в коде есть. В каждом коде всегда есть строка, в которой переменная получает свое значение в последний раз и потом работает как константа.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Формирование функций от переменных
« Reply #14 on: September 24, 2017, 09:41:02 PM »
Вот же вопрос... (я выделил фразы, которые считаю ключевыми в этом вопросе).
А почему ты взял не первый пост с оригинальным вопросом?
Требуется задавать масштабируемые значения для переменных, т.е. чтобы координаты для формул прописывались не в явном виде, а как функция =
...
- просто замучаешься. Наверняка есть возможность задания подобных функций, чтобы можно было сокращать до примерно
ldown(функция($x_ishodnoe),функция($y_ishodnoe))
Но увы в описаниях не нашел. Если просто через обычную подпрограмму - то надо вводить какие-то дополнительные переменные чтобы вернуть рассчитанное значение... Явно я что-то в хэлпах не обнаружил? подскажите плз...

И фраза: 'мне не надо прятать код' относится к предложению include. Ну не надо, так не надо.
Тот пересчет который в примерах одной переменной не заменишь, нужно столько переменных, сколько вариантов. И путаться уже начнет в этих переменных.
Не вопрос. Можно и так делать и эдак, что ему удобней.
« Last Edit: September 24, 2017, 09:46:45 PM by Vint »