Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
5.10.2010, 17:58
Сообщение
#741
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
2. Привыкайте скрипты обзывать латинскими символами! Иначе получится не название, а тупая линия. Спасибо за пояснение.. я уже "подозревал" т.е. понял на тяжком опыте! я и так делал N=N+0 и получалось обрабатывать! А вот для вывода не знал, что делать! Люблю я нашу кириллицу! и у себя всё на ней "обзываю". Просто когда прикреплял хотел поменять.. но уже лень стало так и дописал где что. Но учту впредь. |
|
|
7.10.2010, 14:08
Сообщение
#742
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
Вот ещё такой вопрос:
Код N = 13 Core.SendToAll (" \n \n Ряд ФИБОНАЧЧИ: \n") A = 0 B = 1 while ( B <= N or A <=N ) do if A <= N then A = A + B , Core.SendToAll (""..A.."") end if B <= N then B = A + B , Core.SendToAll (""..B.."") end end и получаем ряд: 0 1 1 2 3 5 8 13 почему прописываются первые 0 и 1 ?? вроде не должны... (т.е. как это в цикле выполняется сразу вывод, если сперва сложение идёт?) |
|
|
7.10.2010, 16:31
Сообщение
#743
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
AirKobra45, убери вот тут запятые и все будет как надо
Код A = A + B , Код B = A + B , А вывод у тебя неверный т.к. из-за запятой, вычисляется сначала все что стоит после равно, а потом уже идет присвоение переменным значений. Из-за подобной хитрости работает Код A, B = B, A
|
|
|
7.10.2010, 16:53
Сообщение
#744
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
Блин ты меня опередил... тока прочёл 2.4.3 - Присваивание (сделал одним циклом!)
и поменял вот так: Код A = 0 B = 1 while A <=N do A = A + B , Core.SendToAll (""..A.."") A, B = B, A end а то что с запятой хорошо! так и надо! просто я не знал что так получается.. но ряд правильно выводится... Чучтвую мои мысли втекают в нужное русло... Вот ещё с функцией ipairs разобраться! Код for i,v in ipairs(t) do body end В скриптах, идёт перебор от 1 (автоматом присваивается к i ) до первого отсутствующего ключа. А V присваивается перебераемые значения из таблицы t. (Я правильно понял?) А вот в некоторых случаях вместо i использовали key (в чём разница?) И вот ещё такое: Код for i = 1, #Tablica do body end (Это как в ipairs перебор тоже?) #Tablica - это как? это я так понимаю подобие table.getn(Tablica) (получение количества индексов) или до первого отсутствующего ключа?
Прикрепленные файлы
|
|
|
7.10.2010, 18:03
Сообщение
#745
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Опять же всё есть в документации, но если тебе надо, поясню: ipairs перебирает таблицу по порядку, но если только индексы таблицы целочисленны и непрерывны, т.е. перебор идет от 1 до первой дырки. #tTable аналогично table.getn(tTable). pairs перебирает всю таблицу, но беспорядочно. i,v - условные обозначения ключа и значения таблицы по этому ключу, таким образом при проходе в цикле for i,v in ipairs(t) do ты получаешь 2 локальные переменные - ключ и значение таблицы соответственно. Написать можно и for sKeyHere, diffTypesValue in pairs(tTable) do как обзывать переменные - твое дело. Что касается конструкции for i = 1, #Tablica do то по некоторым исследованиям, она работает в разы быстрее, но в самом цикле ты не имеешь локальных переменных и к таблице приходится обращаться из окружений выше.
|
|
|
7.10.2010, 19:39
Сообщение
#746
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Цитата Что касается конструкции for i = 1, #Tablica do то по некоторым исследованиям, она работает в разы быстрее, но в самом цикле ты не имеешь локальных переменных и к таблице приходится обращаться из окружений выше. Если в цикле нету обращений к элементам таблицы, то да, этот цикл работает быстрее, в противном случае лучше юзать итерационные функции ipairs и pairs. Итерационная функция сразу кладёт значение в стек, таким образом, получаем оптимизацию не на уровне lua, а на уровне СИ, что всегда быстрее. |
|
|
7.10.2010, 21:57
Сообщение
#747
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Цитата #tTable аналогично table.maxn(tTable) Не аналогично. Оператор длины работает до первого пропущенного индекса, а функция table.maxn - до наибольшего числа в таблице. |
|
|
8.10.2010, 8:45
Сообщение
#748
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Ага. Вот точная цитата с lua.ru.
Цитата Функция table.getn соответствует новому оператору длины (#); испольщуйте оператор вместо функции.
|
|
|
8.10.2010, 10:34
Сообщение
#749
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Спасибо за разбор полетов, надо почаще так собираться Поправился выше... Цитата с
Цитата table.maxn (table) Возвращает наибольший положительный числовой индекс заданной таблицы, или zero если таблица не имеет положительных числовых индексов. (Для выполнения запроса эта функция перебирает все индексы таблицы.) Хотя лучший вариант - все-таки знать что у тебя индекс таблицы без дыр и применять к ней соответствующие функции, любо же работать с ней как с таблицей, в которой индексы не целочисленны. |
|
|
8.10.2010, 14:08
Сообщение
#750
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Цитата Для выполнения запроса эта функция перебирает все индексы таблицы. Именно поэтому, если в таблице только целочисленные индексы (с дырами или без), то лучше использовать цикл: Код for k, v in pairs(tTable) do ... end а не цикл: Код for i = 1, table.maxn(tTable) do ... end Так как в последнем случае мы фактически пробегаемся по циклу 2 раза. |
|
|
8.10.2010, 15:42
Сообщение
#751
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
Я получил значение (число до этого вытащил из строки)
Код iCmdId = tonumber(iCmdId) Мне выдаёт такую ошибку, в нижеследующей строке: Код function ComplGen() --[[Вот в этой строке:]]-- local Result1 = MatTable.[iCmdId][2][math.random(1, #MatTable.[iCmdId][2])] --[[Даже так пробовал!]]-- "local Result1 = MatTable.["..iCmdId.."][2][math.random(1, #MatTable.["..iCmdId.."][2])]" ---- end Всё одно! Не работает! Подскажите пожалуйста в чём ошибка? Что не так? |
|
|
8.10.2010, 15:51
Сообщение
#752
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
AirKobra45, а сами ошибки показать не судьба? Экстрасенсорика уже устала...
Есть предположение, что переменная iCmdId у тебя локальная, а вызывая другую функцию, ты не передаешь ее, тем самым она просто пропадает. |
|
|
8.10.2010, 18:35
Сообщение
#753
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
AirKobra45, а сами ошибки показать не судьба? Экстрасенсорика уже устала... Есть предположение, что переменная iCmdId у тебя локальная, а вызывая другую функцию, ты не передаешь ее, тем самым она просто пропадает. Сейчас посмотрю... Вот вроде всё аккуратно писал, старался обдумать, а всё же ошибочка есть! Файлик сейчас прикреплю. Нашёл! точка стояла! перед [ (Table.[---]) Всё работает! Остался такой вопрос: Код function OnStartup() -------------------- sCmd = "compl" --Команда, сокращение, от compliment. sStartMenu = "Меню хаба\\Действия" --Расположение в Меню -------------------- sMenu = "" for i = 1, #Table do sMenu = sMenu.."$UserCommand 1 3 "..sStartMenu.."\\"..Table[i][1].."$<%[mynick]> !"..sCmd.." "..i.." %[nick]||" -- Table[i][1] = nil ??? end -------------------- function UserConnected(tUser) Core.SendToUser(tUser, sMenu) end OpConnected,RegConnected = UserConnected,UserConnected end Без sMenu = "" и sMenu.. в меню не показывает первый комплимент из таблицы . Почему? Table[i][1] = nil и зачем эта строка? Какой от неё прок? видел в скриптах.. но без неё прекрасно всё работает! ************************************************************ Вот всё почти сделал. Файлик прикрепил посмотрите может что не так или можно эффективнее сделать. Вот повторюсь: Без sMenu = "" и sMenu.. в меню не показывает первый комплимент из таблицы . Почему? Table[i][1] = nil и зачем эта строка? Какой от неё прок? видел в скриптах.. но без неё прекрасно всё работает! и вот в таком цикле: Код for 1, 4 do
d@= "мат выражение" --как сделать, чтобы переменная d после себя заместо @ меняла значения от 1 до 4 (создавались новые переменные d1 d2 d3 d4) end
Прикрепленные файлы
|
|
|
9.10.2010, 12:09
Сообщение
#754
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Без sMenu = "" и sMenu.. в меню не показывает первый комплимент из таблицы . Почему? Без этого ты заменяешь строку, поэтому показывается только последняя, а дополняя ее, показывается всё. Table[i][1] = nil и зачем эта строка? Какой от неё прок? видел в скриптах.. но без неё прекрасно всё работает! Убирает поля из таблицы, если подумать, то они больше нигде не используются в скрипте, т.к. меню уже сгенерировано, поэтому можно удалить эти поля и очистить немного памяти, хотя это уже извращения, однако от лишних больших массивов данных лучше избавляться и вот в таком цикле: Код for 1, 4 do d@= "мат выражение" --как сделать, чтобы переменная d после себя заместо @ меняла значения от 1 до 4 (создавались новые переменные d1 d2 d3 d4) end Проще всего тебе сделать так и пока над такими извратами не заморачиваться: Код local t = {} for i = 1, 4 do t["d"..i] = "мат выражение" end И сам скрипт, немного его переделал...
Прикрепленные файлы
|
|
|
29.10.2010, 16:47
Сообщение
#755
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
Вот появилась новая идея вывести всем попрошайкам КОНТЕР СТРАЙКА в ДЦ из файла текст с серверами.. Вот что есть:
Код function OnStartup() -------------------- sCmd = "CSS" --Команда, сокращение. sStartMenu = "Меню хаба\\Игры" --Расположение в Меню -------------------- sMenu = "$UserCommand 1 3 "..sStartMenu.."\\Counter Strike$<%[mynick]> !"..sCmd.."||" -------------------- function UserConnected(tUser) Core.SendToUser(tUser, sMenu) end OpConnected,RegConnected = UserConnected,UserConnected end -------------------- sBot = SetMan.GetString(21) sFile = Core.GetPtokaXPath().."scripts/Games/CSS_SERVERS.txt" function ChatArrival(tUser, sData) sData = string.sub(sData,1,-2) local sCmd = sData:match"%b<>%s*!(%S+).*" if sCmd == "CSS" or sCmd == "КСС" then Core.SendToNick(tUser, "<"..sBot.."> "..LoadText(sFile)) return true end end -------------------- function LoadText(sFile) local message = "" local f = io.open( Core.GetPtokaXPath().."scripts/Games/CSS_SERVERS.txt" , "r" ) if f then message = f:read("*all") message = string.gsub(message,"|","") f:close() end return message end вот создал менюшку.. по одной из тем пытался вывести.. ничего не получилось.. в итоге всё перемешано... Объясните что делает function LoadText(sFile).. и вообще как правильно вывести текст многострочный из файла в чат.. |
|
|
29.10.2010, 16:57
Сообщение
#756
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
вместо
Код Core.SendToNick(tUser, нужно написать Код Core.SendToUser(tUser, илиКод Core.SendToNick(tUser.sNick, Функция LoadText читает всё из файла и возвращает всё считанное из файла, удаляя по ходу символы |, так как они являются разделителями протокола и ещё... вместо Код local f = io.open( Core.GetPtokaXPath().."scripts/Games/CSS_SERVERS.txt" , "r" ) нужно бы написать так:Код local f = io.open(sFile , "r" )
|
|
|
29.10.2010, 17:05
Сообщение
#757
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
Сейчас попробую...
а вот с послать нику.. да там мой косяк.. сам исправил а уже подзабыл... как правильно! Теперь значит так... 1 строчка выводится без проблем а вот текстовый файл не хочет показывать Код 10.222.21.6 - ReservoirDogs 10.222.53.195 - Pioneer Server (ssClient) 10.222.1.234:27015 - Wcs Rpg Server это содержимое.. что сделать не пойму... \n в конце тоже не помогло... А всё! моя ошибка... имена чуток не совпадали ... в скрипте и самого файла... |
|
|
29.10.2010, 17:53
Сообщение
#758
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
А не проще подавать юзеру обычный текстовый файл по команде, соответствующей названию текстового файла из папки texts?
Не нужно никаких скриптов, а строку вызова можно сунуть в любой скрипт, в тот же ХабМеню, например.. |
|
|
30.10.2010, 17:53
Сообщение
#759
|
|
Активный участник Группа: Пользователи Сообщений: 94 Регистрация: 2.10.2010 Из: Якутия, г.Нерюнгри Пользователь №: 7 820 Спасибо сказали: 21 раз |
Возможно всё... но не обо всём мы знаем..
Вот такой ещё вопрос: В чате пользователи применяют друг к другу команды. вот мне нужно знать кто какую применил и к кому как можно это сделать? (у нас все юзеры... нет опов и прочего) Вот Core.SendToNick(tUser.sNick) не подходит! я так понял.. вот даже не знаю что применить... |
|
|
30.10.2010, 19:24
Сообщение
#760
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Если в команде фигурирует ник юзера - можно брать оттуда, если нет - никак, меню появляется просто по клику мыши и если в команде не указан параметр %[nick] то и ник передаваться не будет. В общем запрос очень странный и вряд ли выполнимый. Ты хочешь следить вообще за всем на хабе?))
|
|
|
Похожие темы
|
Сейчас: 23.11.2024, 10:02 |