Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Kорзина _ Помогите Исправить Ошибку

Автор: Артём 29.12.2008, 1:00

beat_brick.gif в скрипте выдаёт ошибку "asciitalk_i.lua:388: attempt to index local 'file' (a nil value)" помогите исправить плиз.
 ASCII.rar ( 12.91 килобайт ) : 12

Автор: Артём 30.12.2008, 20:10

eyes_droped.gif помогите плиз,я испробовал что мог,не не могу его ожевить...

Автор: Wariner 30.12.2008, 21:21

поробуй заменить self.Path на ATalk.Path

Автор: Nickolya 30.12.2008, 21:32

Функция OnStartup() переписывается так:

Код
function OnStartup()
    ATalk.Path = Core.GetPtokaXPath().."scripts/"..ATalk.Path
    ATalk:Main()
end
и все запускается big_smile.gif

Цитата(Wariner @ 30.12.2008, 21:21) *
поробуй заменить self.Path на ATalk.Path

Не в этом суть... self тут выражает переданный скрыто первый параметр, это таблица ATalk (делается это методом как раз двоеточия: ATalk:Main()), видимо это некоторый метод оптимизации, возможно так быстрее идет обращение к переменным, Сетапер, Илюх, так ли это? big_smile.gif

А ошибка в том что файл не может быть открыт, все из-за путей, как и всегда. surrender.gif

Автор: Артём 30.12.2008, 21:37

Исправил (71 строка) ошибка пропала,а меню как небыло так и нету... eyes_droped.gif

Автор: Nickolya 30.12.2008, 21:45

Давай доделывать скрипт дальше... Ищи

Код
OpConnected = UserConnected
ниже дописывай
Код
RegConnected = UserConnected

Автор: Артём 31.12.2008, 10:10

victory.gif спасибо за помощь,за перевод скрипта возьмусь в свободное время.

:P кое-как перевёл,если кому интересно выкладую скрипт
 Веслые_к...ки_в_чат.rar ( 13.4 килобайт ) : 6

P.S. если кто сможет перевести поподробней буду благодарен
 Алфавит.txt ( 16.17 килобайт ) : 9
- русский алфавит,заменить место англ букв,работает прикольно

CODE
[10:24:09] <UzVeR> !blowup БАБА
•••••• •• •••••• ••
•• •• •• •• •• ••
•• •• •• •• •• ••
•••••• •• •• •••••• •• ••
•• •• •• •• •• •• •• ••
•• •• •••••••••• •• •• ••••••••••
•• •• •• •• •• •• •• ••
•••••• •• •• •••••• •• ••

только команду в чат посылет,как можно исправить это?

Автор: Setuper 2.1.2009, 19:38

Цитата(Nickolya @ 30.12.2008, 21:32) *
Не в этом суть... self тут выражает переданный скрыто первый параметр, это таблица ATalk (делается это методом как раз двоеточия: ATalk:Main()), видимо это некоторый метод оптимизации, возможно так быстрее идет обращение к переменным, Сетапер, Илюх, так ли это? big_smile.gif


"Метод" по быстродействию ничем не уступает простой функции, однако, использование методов говорит о направленности к объектно-ориентированному программированию, что в свою очередь считается хорошим стилем.

Синтаксис метода такой же как у функции, но любой метод содержит родительскую таблицу, которая указывается перед именем функции и отделяется от имени двоеточием.

Метод:
Код
function Test:Func(param1, param2)
равносилен функции:
Код
function Test.Func(Test, param1, param2)

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

Пример:

Можно написать так:
Код
tTest={
  sMsg="Hello world!"
}

function tTest.Func1()
  Core.SendToAll(tTest.sMsg)
  ...
end

tTest.Func1()
а можно написать так:
Код
tTest={
  sMsg="Hello world!"
}

function tTest:Func1()
  Core.SendToAll(self.sMsg)
  ...
end

tTest:Func1()

Потом, например, мы решили изменить имя таблицы с tTest на tTable, при этом, средствами замены редактора (Ctrl-H) воспользоваться нельзя, допустим из-за того, что в этом скрипте есть такие же имена локальных параметров (tTest). Также допустим, что кроме написанных действий в указанной функции есть очень много других действий, в которых используются переменные глобальной таблицы tTest. При таком раскладе в первом способе нужно будет проделать большую работу по замене переменной, во втором же способе нужно будет заменить только таблицу метода, так как в теле метода будут везде вместо tTest встречаться self. В данном примере метод работает быстрее, чем функция из-за того, что у функции 3 параметра, а у метода их 2 (каждый параметр передаётся через стек, а следовательно под локальную переменную каждого параметра выделяется дополнительная память).

Переменная self передаётся в метод по ссылке, а не через стек как все переменные. Это означает, что эту переменную можно использовать как для чтения, так и для записи!
Не мало важным фактом является и то, что эта переменная является переменной-указателем, то есть все операции над этой переменной происходят в памяти, которая выделена под переменную, на которую ссылается данная переменная self. Как раз из-за этого метод и обычная функция являются равносильными, однако повторю ещё раз, что использование методов является хорошим стилем программирования.


Под обычной функцией подразумевается следующее:

Код с обычной функцией:
Код
tTest={}
function F(param1, param2)
...
end

или вот с такой обычной функцией:
Код
tTest={}
function tTest.F(param1, param2)
...
end

по быстродействию ничем не уступает следующему методу:
Код
tTest={}
function tTest:F(param1, param2)
...
end

Однако, функция, которая равносильна методу выше:
Код
tTest={}
function tTest.F(tTest, param1, param2)
...
end
будет работать медленнее чем метод из-за передачи параметра tTest через lua-стек.