myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
 
Ответить в данную темуНачать новую тему

> Не работает dofile(filename) ?

Теги
Нет тегов для показа
dimajak
сообщение 17.3.2011, 0:06
Сообщение #1


Продвинутый участник
****

Группа: Пользователи
Сообщений: 157
Регистрация: 19.1.2010
Из: Волгоград
Пользователь №: 5 756
Спасибо сказали: 76 раз




Столкнулся с тем, что из файла не загружается таблица.
Создал тестовый скрипт и тестовый файл с данными.
При старте скрипта теоретически в переменную Players должна загрузиться таблица из файла test_file.dat.
В Оп-чат выводится сообщение об успешной загрузке файла.
При подключении юзера добавляется пункт в меню (команда !f), по этой команде выводится содержимое переменной-таблицы Players.
Но этого не происходит. :(
Прикрепляю архив со скриптом и файлом с данными.

Помогите найти ошибку.
Прикрепленные файлы
Прикрепленный файл  test_file.rar ( 675 байт ) Кол-во скачиваний: 10
 
Go to the top of the page
+Quote Post
Kingston
сообщение 17.3.2011, 1:06
Сообщение #2


Активный участник
***

Группа: Пользователи
Сообщений: 85
Регистрация: 19.3.2009
Из: Россия, Хабаровский край, г.Комсомольск-на-Амуре
Пользователь №: 2 652
Спасибо сказали: 38 раз




Сделай глобальной таблицу:
Код
Players = {}
Go to the top of the page
+Quote Post
Ksan
сообщение 17.3.2011, 1:25
Сообщение #3


Белый Волк
*********

Группа: Пользователи
Сообщений: 1 709
Регистрация: 11.9.2008
Из: г.Томск
Пользователь №: 516
Спасибо сказали: 637 раз




Ещё добавлю...чтоб при загрузке файла в Опчат показало, сколько записей в таблице, нужно чтение числа записей организовать так:
Код
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
Go to the top of the page
+Quote Post
dimajak
сообщение 17.3.2011, 2:15
Сообщение #4


Продвинутый участник
****

Группа: Пользователи
Сообщений: 157
Регистрация: 19.1.2010
Из: Волгоград
Пользователь №: 5 756
Спасибо сказали: 76 раз




Экспериментально выяснил, что вместо
Код
local Players = {}
работает
Код
Players = {}
т.е. без local.
Kingston правильно сказал.
Осталось понять почему?
Ведь если я определяю в скрипте переменную без local, то она должна быть доступна в других скриптах? Нет?

Цитата(Ksan @ 17.3.2011, 1:25) *
Иначе у тебя будет по нулям.
Изначально таблица пуста, поэтому нет смысла пробегать циклом. Даже если таблица из файла не пустая, то я знаю сколько в ней элементов и есть ли в ней "пустышки", ведь я создавал этот тестовый скрипт и тестовый файл с данными специально наиболее простым, дабы исключить все другие помехи. big_smile.gif Это был не тест на сообразительность. big_smile.gif
Go to the top of the page
+Quote Post
Ksan
сообщение 17.3.2011, 2:31
Сообщение #5


Белый Волк
*********

Группа: Пользователи
Сообщений: 1 709
Регистрация: 11.9.2008
Из: г.Томск
Пользователь №: 516
Спасибо сказали: 637 раз




Ни одна переменная не вылезет к другим скриптам. Глобал - относительно пространства именно одного конкретного скрипта.
В Птоке.
Go to the top of the page
+Quote Post
dimajak
сообщение 17.3.2011, 2:35
Сообщение #6


Продвинутый участник
****

Группа: Пользователи
Сообщений: 157
Регистрация: 19.1.2010
Из: Волгоград
Пользователь №: 5 756
Спасибо сказали: 76 раз




Тогда смысл в "local" в скрипте?
П.С. просто затормозило мафию на несколько дней. big_smile.gif
Go to the top of the page
+Quote Post
Andrean
сообщение 17.3.2011, 7:28
Сообщение #7


Абсолютный новичок


Группа: Пользователи
Сообщений: 6
Регистрация: 7.9.2009
Пользователь №: 4 380
Спасибо сказали: 1 раз




http://mydc.ru/ipb.html?s=&showtopic=1...ost&p=14327


Спасибо сказали:
Go to the top of the page
+Quote Post
Kingston
сообщение 17.3.2011, 8:43
Сообщение #8


Активный участник
***

Группа: Пользователи
Сообщений: 85
Регистрация: 19.3.2009
Из: Россия, Хабаровский край, г.Комсомольск-на-Амуре
Пользователь №: 2 652
Спасибо сказали: 38 раз




дальше скрипта переменные и фукции никуда не выйдут и доступ к к функциям и переменным одного скрипта из другого не будет, если первый скрипт не загружен.
локальные переменные заданные в функциях не доступны другим функциям и наоборот, получается. а смысл в оптимизации http://mydc.ru/index.html?showtopic=1018&a...post&p=7538


Спасибо сказали:
Go to the top of the page
+Quote Post
Setuper
сообщение 17.3.2011, 9:57
Сообщение #9


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1703 раза




Функция dofile загружает дополнительный lua код в текущий скрипт, и этой функции доступно только глобальное окружение скрипта.
В свою очередь, если в загружаемом функцией dofile файле объявляется глобальная переменная, а в самом скрипте определена такая же переменная но локально, то локальная переменная имеет выше приоритет, чем глобальная, при этом функция dofile не имеет доступа к локальной переменной. Отсюда получаем, что dofile загружает в глобальную переменную Players, а скрипт будет брать локальную переменную Players.
Для того чтобы обратиться к глобальной переменной нужно обращаться к ней через таблицу _G.
То есть в данном случае просмотреть содержимого ГЛОБАЛЬНОЙ переменной Players возможно следующим образом:
Код
for i,v in pairs(_G.Players) do


Спасибо сказали:
Go to the top of the page
+Quote Post

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No New Posts авторегистрация не работает
8 dsd10 5 029 7.11.2012, 22:41 Посл. сообщение: Vizunchik
Closed как удалить что хаб работает на версии
5 absent 4 823 12.2.2011, 14:49 Посл. сообщение: Saymon21
No new Не работает хаб
52 Demest 17 776 16.8.2010, 8:31 Посл. сообщение: Артём
No New Posts От: Не работает хаб
От темы с ID: 3758
0 Delia 2 082 11.8.2010, 21:27 Посл. сообщение: Delia
No New Posts Topic has attachmentsпочему не работает этот скрипт переделайте его что бы он работал
скрипт переделайте
4 Artem26 3 914 26.5.2010, 17:54 Посл. сообщение: Артём
No New Posts Topic has attachmentsНе работает скрипт.
1 Invisible 3 672 15.1.2010, 7:24 Посл. сообщение: Wildcdu
Closed Topic has attachmentsПоиск не работает !
1 ShadoWx 2 610 26.9.2009, 10:13 Посл. сообщение: Maximum
No New Posts Topic has attachmentsПомогите Скрипт Не Работает
API 2
2 Артём 3 335 20.12.2008, 17:01 Посл. сообщение: Артём
No New Posts Topic has attachmentsНе Работает =\
4 LeoSP 4 144 17.11.2008, 19:30 Посл. сообщение: LeoSP
No New Posts Topic has attachmentsПомогите Скрипт Не Работает
Скрипт не работает
13 Артём 8 088 11.11.2008, 18:44 Посл. сообщение: Артём

 



RSS Сейчас: 20.1.2018, 21:42