Не работает dofile(filename) ? |
Здравствуйте, гость ( Вход | Регистрация )
Не работает dofile(filename) ? |
17.3.2011, 0:06
Сообщение
#1
|
|
Продвинутый участник Группа: Пользователи Сообщений: 157 Регистрация: 19.1.2010 Из: Волгоград Пользователь №: 5 756 Спасибо сказали: 77 раз |
Столкнулся с тем, что из файла не загружается таблица.
Создал тестовый скрипт и тестовый файл с данными. При старте скрипта теоретически в переменную Players должна загрузиться таблица из файла test_file.dat. В Оп-чат выводится сообщение об успешной загрузке файла. При подключении юзера добавляется пункт в меню (команда !f), по этой команде выводится содержимое переменной-таблицы Players. Но этого не происходит. :( Прикрепляю архив со скриптом и файлом с данными. Помогите найти ошибку.
Прикрепленные файлы
|
|
|
17.3.2011, 1:06
Сообщение
#2
|
|
Активный участник Группа: Пользователи Сообщений: 85 Регистрация: 19.3.2009 Из: Россия, Хабаровский край, г.Комсомольск-на-Амуре Пользователь №: 2 652 Спасибо сказали: 39 раз |
Сделай глобальной таблицу:
Код Players = {}
|
|
|
17.3.2011, 1:25
Сообщение
#3
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
Ещё добавлю...чтоб при загрузке файла в Опчат показало, сколько записей в таблице, нужно чтение числа записей организовать так:
Код function OnStartup() if loadfile(filename) then dofile(filename) local n = 0 for i in pairs(Players) do n = n + 1 end Core.SendToOpChat("Loaded "..filename.." Всего в списке = "..n) end end Иначе у тебя будет по нулям. И то же самое сделай в ЧатАрривал, там у тебя тоже есть вывод числа записей. Только к чему вместе с названием файла и весь путь до него? Ты же знаешь его название, так пропиши его в этом сообщении напрямую, или переменную в начале скрипта обозначь с этим названием (без пути), например, так: Код local fname = "test_file.dat" и при отправлении в Опчат пиши это слово - "fname" вместо "filename"А то выглядит несуразно: Цитата [04:21:49] <_OpChat_> Loaded D:/SOFT/INTERNET/P2P/HUBS/PtokaX_0411_IndyHub/scripts/test_file.dat Всего = 2 Вывод таблицы перекрой так, чтоб весь список был в одном сообщении. Например, так: Код if cmd == "!f" then local n = 0 for i in pairs(Players) do n = n + 1 end local list = "\nСписок Players. Всего в списке = "..n.."\n" for i,v in pairs(Players) do list = list.."\t"..i.."\n" end Core.SendToUser(tUser, list.."Конец списка Players") end В результате получишь в Опчат это: Цитата [04:50:01] <_OpChat_> Loaded test_file.dat Всего в списке = 2 В чате таблица так: Код [04:43:03]
Список Players. Всего в списке = 2 Волотька TIMON Конец списка Players |
|
|
17.3.2011, 2:15
Сообщение
#4
|
|
Продвинутый участник Группа: Пользователи Сообщений: 157 Регистрация: 19.1.2010 Из: Волгоград Пользователь №: 5 756 Спасибо сказали: 77 раз |
Экспериментально выяснил, что вместо
Код local Players = {} работаетКод Players = {} т.е. без local.Kingston правильно сказал. Осталось понять почему? Ведь если я определяю в скрипте переменную без local, то она должна быть доступна в других скриптах? Нет? Иначе у тебя будет по нулям. Изначально таблица пуста, поэтому нет смысла пробегать циклом. Даже если таблица из файла не пустая, то я знаю сколько в ней элементов и есть ли в ней "пустышки", ведь я создавал этот тестовый скрипт и тестовый файл с данными специально наиболее простым, дабы исключить все другие помехи. Это был не тест на сообразительность.
|
|
|
17.3.2011, 2:31
Сообщение
#5
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
Ни одна переменная не вылезет к другим скриптам. Глобал - относительно пространства именно одного конкретного скрипта.
В Птоке. |
|
|
17.3.2011, 2:35
Сообщение
#6
|
|
Продвинутый участник Группа: Пользователи Сообщений: 157 Регистрация: 19.1.2010 Из: Волгоград Пользователь №: 5 756 Спасибо сказали: 77 раз |
Тогда смысл в "local" в скрипте?
П.С. просто затормозило мафию на несколько дней. |
|
|
17.3.2011, 7:28
Сообщение
#7
|
|
Абсолютный новичок Группа: Пользователи Сообщений: 6 Регистрация: 7.9.2009 Пользователь №: 4 380 Спасибо сказали: 1 раз |
|
|
|
17.3.2011, 8:43
Сообщение
#8
|
|
Активный участник Группа: Пользователи Сообщений: 85 Регистрация: 19.3.2009 Из: Россия, Хабаровский край, г.Комсомольск-на-Амуре Пользователь №: 2 652 Спасибо сказали: 39 раз |
дальше скрипта переменные и фукции никуда не выйдут и доступ к к функциям и переменным одного скрипта из другого не будет, если первый скрипт не загружен.
локальные переменные заданные в функциях не доступны другим функциям и наоборот, получается. а смысл в оптимизации http://mydc.ru/index.html?showtopic=1018&a...post&p=7538 |
|
|
17.3.2011, 9:57
Сообщение
#9
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Функция dofile загружает дополнительный lua код в текущий скрипт, и этой функции доступно только глобальное окружение скрипта.
В свою очередь, если в загружаемом функцией dofile файле объявляется глобальная переменная, а в самом скрипте определена такая же переменная но локально, то локальная переменная имеет выше приоритет, чем глобальная, при этом функция dofile не имеет доступа к локальной переменной. Отсюда получаем, что dofile загружает в глобальную переменную Players, а скрипт будет брать локальную переменную Players. Для того чтобы обратиться к глобальной переменной нужно обращаться к ней через таблицу _G. То есть в данном случае просмотреть содержимого ГЛОБАЛЬНОЙ переменной Players возможно следующим образом: Код for i,v in pairs(_G.Players) do
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последнее сообщение | |
---|---|---|---|---|---|
авторегистрация не работает | 8 | dsd10 | 12 952 | 7.11.2012, 22:41 Посл. сообщение: Vizunchik | |
как удалить что хаб работает на версии | 5 | absent | 10 044 | 12.2.2011, 14:49 Посл. сообщение: Saymon21 | |
Не работает хаб | 52 | Demest | 45 428 | 16.8.2010, 8:31 Посл. сообщение: Артём | |
От: Не работает хаб От темы с ID: 3758 |
0 | Delia | 4 630 | 11.8.2010, 21:27 Посл. сообщение: Delia | |
почему не работает этот скрипт переделайте его что бы он работал скрипт переделайте |
4 | Artem26 | 8 829 | 26.5.2010, 17:54 Посл. сообщение: Артём | |
Не работает скрипт. | 1 | Invisible | 6 913 | 15.1.2010, 7:24 Посл. сообщение: Wildcdu | |
Поиск не работает ! | 1 | ShadoWx | 5 683 | 26.9.2009, 10:13 Посл. сообщение: Maximum | |
Помогите Скрипт Не Работает API 2 |
2 | Артём | 6 861 | 20.12.2008, 17:01 Посл. сообщение: Артём | |
Не Работает =\ | 4 | LeoSP | 8 973 | 17.11.2008, 19:30 Посл. сообщение: LeoSP | |
Помогите Скрипт Не Работает Скрипт не работает |
13 | Артём | 16 957 | 11.11.2008, 18:44 Посл. сообщение: Артём |
|
Сейчас: 23.11.2024, 5:18 |