Решил я попробовать, что такое 56 сфера.Скажите мне как вы живете с local, которые не string?
я раньше проверял открыт ли local или нет. А теперь он всегда 0.и дату в нем хранить тоже нельзя.
local.txt = "2019/01/09"
он сразу делить пытается
ладно нашел dlocal. вроде хоть эта часть отпала.
тогда по аналогии надо еще
slocal.
plocal. - это как ref, только поименованный
однако все равно вопрос, куда сохранять что-то вроде
local. = "123.456.789"
пару часов угробил на разбитие числа на разряды.
А где тут циклы по TAG с маской?
CLEARTAGS по маске?
чо тут до появления LIST то делать?
где обещанные удобства?
мне кажется это вообще должно идти в комплекте с каждой сферой, но нет.
tag.plr_<uid>
tag.plr_<uid>
for 0 <eval(<tagcount> - 1)>
if strmatch("plr_*",<tagat.<eval(<local._for>)>.key>)
ref1 = <tagat.<eval(<local._for>)>.value>
endif
endfor
fortags sample*
<local._var_value> = <local._var_name>
endfor
Все кто пишет, что сфера говно. я согласен полностью!
я как будто в каменный век провалился.
Sphere Gauno!
Так это псевдоязык уровней аля школьник 8 класса )
Конечно если хочешь удобство и красоту - надо брать РанКу с нормальным шарпом, дебагером и IDE )
Я лично сферу использую потому что: 1) уже набита рука к тому что ты описал и я не трачу время на "разбирательства" как сделать лучше 2) я привык работать с ней без IDE и подсветки кода 3) у меня нет желания делать "правильно и гибко" на шарпе т.к. это дольше для меня, чем из "гомна и палок" слепить готовый mvp
Ты не понял. Я хотел перейти со своей 55й на 56ю.
И понял что когда "уже набита рука" теперь невозможно работать с local. от слова совсем, невозможно работать с tag.
почему они не string? что за херня?!
я конечно придумал писать
local. = txt 34/24/24
а потом
STREAT
зато
return - выдает все как положено.
local.y = 40
serv.log <eval((<local.y> / 40) - (<local.y> / 10))> = -3
serv.log <eval((<local.y> / 40) + (<local.y> / 40))> = 2
serv.log <eval((<local.y> / 40) - (<local.y> / 10) + (<local.y> / 40))> = -4
serv.log <eval((<local.y> / 40) + (<local.y> / 40) - (<local.y> / 10))> = -2
serv.log <eval(1 - 4)> = -3
serv.log <eval(1 + 1)> = 2
serv.log <eval(1 - 4 + 1)> = -4 (WAT?)
serv.log <eval(1 + 1 - 4)> = -2
Да, такая фишка сферы и очень давно. Спецом отписал в дискорде сферы, таки подтвердили, что она вычисляет с права на лево. Вот такая особенность, поэтому лучше использовать скобки. И вроде как в твоей 55й должно быть тоже самое, если там не модифили код и не переделывали это принудительно.
Как мне написали **Some parts of the source have been untouched for ages** ))
В том то и дело... что я не заново делаю, я тупо переношу скрипты. и они начинают работать не так, как до этого.
и когда у тебя 6 мб кода без предметов и всяких дефолтов.
ну это просто ахтунг!
если что я там юлианскую дату считаю.
понятно дело, что если она не будет совпадать, все накроется медным тазом!
P.S. и да я так и сделал, воспользовался скобками
Смотрите прикол:
local.m = "2019/03/10"
tag.i = <local.m> - ошибка деления на ноль
local.m = "2019/03/10"
tag.i = "<local.m>" - вроде ок
serv.newitem
local.m = "2019/03/10"
new.tag.i = "<local.m>" - опять ошибка деления
Ну на самом деле все это обычные ошибки языков без строгой типизации. Тот же ЖС имеет подобные бока постоянно, поэтому я бы советовал по 100 раз перепроверять (как ты и делаешь) переменные и результат, а лучше отказыватся от даты в таком виде, точнее с такими разделителями. Лучше /*:-+% - все это может не правильно быть понято интерпритатором при работе с переменными.
serv.rtime - к сожалению в таком виде.
и я их просто сравнивал... не осуществляя никаких махинаций.
в др виде ее хранить, это значит и serv.rtime как-то каждый раз модифицировать.
я вообще юлианскую дату вычисляю.
Ну на вскидку пару идей,
1. SERV.RTIME.FORMAT
2. Хранить в юникстайме
3. Вычислять юлианскую через mysql
В любом случае работать с датами в таком формате (сравнивать, модифицировать и тп) не вариант. Обычный юникстайм в помощь, дальше от него плясать или через базу или свои функции навешивать для преобразования. Иначе реально будешь спотыкатся на сферовских приколах ))
Ну и быстрое решение с интернета в псведокоде если мы таки работаем c unixtime. Правда нет под рукой сферы что б точно сказать формат SERV.TIME, но поидеи сфера как то в нем вернуть точно должна смочь
Эпоха Unix (нулевая точка) - 1 января 1970 года. Это соответствует юлианскому дню 2440587.5
function float getJulianFromUnix( int unixSecs )
{
return ( unixSecs / 86400.0 ) + 2440587.5;
}
Когда работал на Сфере, выполнение нетривиальной задачи часто сводилось к "как же мне на**ать Сферу". Самое интересное, что в большинстве случаев получалось. Там просто тонны всяких неочевидных фишек в работе функций и кода.
А всю прелесть работы со стрингами я оценил, когда поставил задачу сделать обфускатор скриптов, написанный на сферскрипте. Вот это была жесть. Я неделю мучался, узнал много нового, а том, как Сфера обрабатывает стринги потом друг написал его мне за вечер на нормальном языке и с нормальной скоростью работы.
Ну это было очень давно, я тогда ни на чем, кроме сферскрипта писать не умел.
чтобы вычислять unixSecs, нужно его вычислять ))) ее же там нет.
кстати нашел
RTICKS
но простите это не отменяет того факта, что сфера не работает так как надо.
все почему-то пытаются мне советовать как надо делать.
а ничего что я не могу на 55 сфере сделать так как надо.
Сфера уже давно опен сорс. Не нравится? Форкаешь и делаешь под себя, а ещё можно посмотреть что на самом деле там происходит.
Да притом что у меня есть исходники 55 сферы, еще до того как это стало мейнстримом.
Я даже могу сравнить изменения и исправления, которые туда за это время внесли.
Но похоже, покуда мы исправляли ошибки и делали сферу юзерфрендли.
На 56 сфере творился полный бардак.
Не понятно о чем топик. То ли о затыке в скрипте, то ли о хейте сферы. Не нравится - не используй
ничего не понимаю в сфере и вообще в написанном, но свои 5 копеек вставлю. не нравится - не читай.
немножко о типах данных в сфере
local.a = // число 0
local.a = 1 // число
local.a = 2/2 // число 1 - однако!
local.a = 1a // число, ну это понятно 16ричное
local.a = 1z // строка
local.a = 1.1 // строка
я хочу сам решать, что у меня за тип данных!
вот вам функция деления числа на разряды
f_math_cathegory 12345678
возвращает результат 12.345.678
немножко про этот долбанутый алгоритм.
я ж не могу сразу проверить открыт local.cat или нет, он же всегда возвращает 0, а у меня внутри может и 0 хранится.
поэтому я ввожу еще один дополнительный параметр local.h, чтобы просто приравнять его к 1.
еще мне к local.cat в конце приходится приписывать букву Z, чтобы сумасшедшяя сфера поняла что у меня string.
в конце я избавлюсь от этой буквы с помощью STRSUB.
Пользуйтесь...
[FUNCTION f_math_cathegory] //делит число на разряды
if strlen(<argn>) <= 3
return <eval <argn>>
endif
local.cat_argn = <argn>
if (<local.cat_argn> < 0)
local.cat_m = 1
local.cat_argn = "<eval(<local.cat_argn> * -1)>"
endif
local.cat_lng = <eval strlen(<dlocal.cat_argn>)>
FOR m <local.cat_lng>
local.cat_i = "<eval <local.cat_lng> - <local.m>>"
local.cat_j = "<eval(0<local.cat_j> + 1)>"
local.cat_chart = "<STRSUB <local.cat_i> 1 <eval(<dlocal.cat_argn>)>>"
if !(0<local.h>)
local.h = 1
local.cat = "<dlocal.cat_chart>z"
elseif (<local.cat_j> == <eval((<local.cat_j> / 3) * 3)>) && (<local.cat_i> != 0)
local.cat = ".<dlocal.cat_chart><local.cat>"
else
local.cat = "<dlocal.cat_chart><local.cat>"
endif
ENDFOR
local.cat_lng = <eval strlen(<local.cat>)>
local.cat = "<STRSUB 0 <eval <local.cat_lng> - 1> <local.cat>>"
if 0<local.cat_m>
local.cat = "-<local.cat>"
endif
return <local.cat>
А вобще советую почитать http://wiki.spherecommunity.net/index.php?title=Category:Variables. В Сфере есть функции для каста типов данных.
if (<local.cat_argn> < 0)
local.cat_m = 1
local.cat_argn = "<eval(<local.cat_argn> * -1)>"
endif
Ладно, я разобрался. Это какая-то кривая версия сферы была. На работе кривая, дома нормальная. Я чуть с ума не сошел.
Ей плевать было на скобки, она все время считала что у меня hex.
[FUNCTION f_math_2cathegory] //делит число на разряды
if strlen(<argn>) <= 3
return <eval <argn>>
endif
local.argn = <argn>
if (<local.argn> < 0)
local.mod = 1
local.argn = <eval(abs(<argn>))>
endif
local.lng = <eval(strlen(<dlocal.argn>))>
local.cut = 3
WHILE <local.lng> > 0
local.lng -= 3
if <local.lng> <= 0
local.cut = 3 + <local.lng>
local.lng = 0
endif
local.char = "<STRSUB <local.lng> <local.cut> <dlocal.argn>>"
if <local.emp> == 0
local.cat = "<local.char>"
local.emp = 1
else
local.cat = "<local.char>.<local.cat>"
endif
ENDFOR
if 0<local.mod>
local.cat = "-<local.cat>"
endif
return <local.cat>
Нет под рукой сферы что бы проверить, но думаю идея понятна
Было бы интересно взять эти две функции да засунуть в цикл из тысячи итераций и посмотреть на скорость
[FUNCTION f_math_2cathegory]
IF (<DB.Connected>==1)
DB.Query "SELECT REPLACE(REPLACE(REPLACE(FORMAT('<eval <argn>>', 2), '.', '@'), ',', '.'), '@', ',') as x"
IF (<DB.ROW.NumRows>>0)
return <DB.ROW.0.x>
ENDIF
ENDIF
return <eval <argn>>
FOR i 0 100000
mysql = 12905ms
Sirocco = 13068ms
FOR i 0 10000
mysql = 1495ms
Sirocco = 1320ms
[FUNCTION f_math_2cathegory]
IF (<DB.Connected>==1)
DB.Query "SELECT REPLACE(REPLACE(REPLACE(FORMAT('<eval <argn>>', 2), '.', '@'), ',', '.'), '@', ',') as x"
IF (<DB.ROW.NumRows>>0)
return <DB.ROW.0.x>
ENDIF
ENDIF
return <eval <argn>>
FOR i 0 100000
12:12:(a.scp,30)[mysql]
12:12:(a.scp,33) 12905ms
12:12:(a.scp,49)[Sirocco]
12:12:(a.scp,52)13068ms
FOR i 0 10000
2:13:(a.scp,30)[mysql]
12:13:(a.scp,33)TOTAL = 1495ms
12:13:(a.scp,49)[Sirocco]
12:13:(a.scp,52)TOTAL = 1320ms
Ну смысла нет, это был чисто эксперемент не слишком ли медленно мускул отвечает в данном случае и выполняет эти преобразования по сравнению со сферовской работой по строке. Как оказалось - достаточно шустро, поэтому я и предлагаю ему переложить всю работу на него. Даже если редко выводить по клику на кучке гп - решенеи с мускулом имхо покрасивше и погибче.
Редко когда тебе понадобится 10000 раз делать такое преобразование сразу ) А заметить разницу на более мелких значениях я просто не мог ибо её почти нет. Так что это чисто эксперемент, стоит ли юзать мускул в данном случае )
Плюс он спрашивал как сократить его код в "раза три"
[FUNCTION f_math_2cathegory]
local.lng = <eval strlen(<args>)>
while <local.lng> > 3
local.lng -= 3
local.res = ".<strsub <local.lng> 3 <args>><local.res>" //отрезаем по 3 и клеим спереди
endwhile
local.leftover = "<strsub 0 <local.lng> <args>>"//то что осталось спереди, может включать в себя '-'
if (!strcmp(-, <local.leftover>) && strlen(<local.leftover>) == 1)
//если нашли только '-', отрезаем точку спереди и 0 в конце строки res
local.res = "<local.leftover><strsub 1 <eval strlen(<local.res>)-2> <local.res>>"
else
//если спереди осталось больше 1 знака, отрезаем только 0 в конце строки res
local.res = "<local.leftover><strsub 0 <eval strlen(<local.res>)-1> <local.res>>"
endif
return <local.res>
[Mysql] 0,13919
[Sirocco] 0,13388
[Aimed] 0,07185
[Mysql] 0,13919
[Sirocco] 0,13388
[Aimed] 0,07185
local.res = ".<strsub <local.lng> 3 <args>><local.res>"
а что делает эта строчка, когда local.res не объявлен... и следовательно равен 0?
.show f_math_2cathegory 1234 => return "12340"
что меня и бесит!
Ну там есть ошибка, при 3х знаках и меньше знаках...
if strlen(<argn>) <= 3
return <argn>
endif
мне не приходила идея отрезать этот лишний ноль. я третий день вообще с этими сложностями борюсь.
мне все говорят иди на 56 сферу, иди на 56 сферу.... все уши прожужжали как это круто...
С багфиксом и комментами
[FUNCTION f_math_2cathegory]
local.lng = <eval strlen(<args>)>
while <local.lng> > 3
local.lng -= 3
local.res = ".<strsub <local.lng> 3 <args>><local.res>" //отрезаем по 3 знака с конца args и клеим в начало res вместе с '.'
endwhile
local.leftover = "<strsub 0 <local.lng> <args>>"//то что осталось спереди, может включать в себя '-'
if (!strcmp(0, <local.res>))
//если число состоит из 3 знаков
local.res = "<local.leftover>"
elseif (!strcmp(-, <local.leftover>) && (strlen(<local.leftover>) == 1))
//если нашли только '-', отрезаем точку спереди и 0 в конце строки res
local.res = "<local.leftover><strsub 1 <eval strlen(<local.res>)-2> <local.res>>"
else
//если спереди осталось больше 1 знака, отрезаем только 0 в конце строки res
local.res = "<local.leftover><strsub 0 <eval strlen(<local.res>)-1> <local.res>>"
endif
return <local.res>
Я тоже хочу шоколад!
Да и вообще я не понимаю 0 там или не 0 в конце добавляет сфера или из 10 получилось 16, то всё равно сфера ведь нормально его обрабатывает! Учись читать код, как Нео из матрицы, тогда будет всё ОК!)
А сферу 56c не пробовали?
Не знаю... я проверял -350 и все работало.
.350
.3500
остаток "-"
-350
Сейчас уже есть сфера Х, 56б устаревшая считается
Да я в твой алгоритм старый это вписал... и даже все промежуточные расчеты тебе скинул. чтобы было наглядно видно как оно работает
Я так понимаю была попытка разделения переменных на типы, т.к. стринги хранить не только накладно по быстродействию, но и они оставляют дыры в памяти (менеджер их хреново подчищает, т.к. блоки маленькие и разной длины).
Но попытка кривая )
С РанУО все бы ничего, но перевод, опять же... и да, там все нахрен переписывать...
Да не нужен мне этот алгоритм... я сюда именно жаловаться пришел.
чтобы соединить 2 local. нужно использовать функцию для работы со строками... сами не смешно?
Очередной прикол:
local.a = "2019/01/13"
serv.log local <local.a>
tag.a = "<local.a>"
serv.log tag <tag.a> - тут вроде правильно показывает
serv.newitem i_gold
new.tag.a = "<local.a>"
- а тут уже Exp_GetVal: Divide by 0
serv.log tag <new.tag.a> - return 07e3
Вот именно что да.
Кстати мб раздел в 0.56b - 0.56d или 0.56x переименовать?
Ну вы и переименовали ничего не понятно, что за Sphere X такая? Лучше бы просто 0.56x. Читайте выше, как вам сказали!
Это как айфон Х
Mortal Kombat X
Откапал для тебя инфы старина. Широко взгляни на этот текст http://wiki.spherecommunity.net/index.php?title=Chapter_5
И еще эти локалы жрут память. ПАМЯТЬ ЖРУТ не забывай об этом в глобальных схемках
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)