| 
	 
	 
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]()  | 
	
 | 
	 
	 
			
			  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 | 14 413 | 7.11.2012, 22:41 Посл. сообщение: Vizunchik | 
![]()  | 
	как удалить что хаб работает на версии | 5 | absent | 11 158 | 12.2.2011, 14:49 Посл. сообщение: Saymon21 | 
![]()  | 
	Не работает хаб | 52 | Demest | 51 735 | 16.8.2010, 8:31 Посл. сообщение: Артём | 
![]()  | 
	 От: Не работает хаб От темы с ID: 3758  | 
	0 | Delia | 5 112 | 11.8.2010, 21:27 Посл. сообщение: Delia | 
![]()  | 
	  скрипт переделайте  | 
	4 | Artem26 | 9 801 | 26.5.2010, 17:54 Посл. сообщение: Артём | 
![]()  | 
	  | 
	1 | Invisible | 7 486 | 15.1.2010, 7:24 Посл. сообщение: Wildcdu | 
![]()  | 
	  | 
	1 | ShadoWx | 6 266 | 26.9.2009, 10:13 Посл. сообщение: Maximum | 
![]()  | 
	  API 2  | 
	2 | Артём | 7 587 | 20.12.2008, 17:01 Посл. сообщение: Артём | 
![]()  | 
	  | 
	4 | LeoSP | 10 009 | 17.11.2008, 19:30 Посл. сообщение: LeoSP | 
![]()  | 
	  Скрипт не работает  | 
	13 | Артём | 18 852 | 11.11.2008, 18:44 Посл. сообщение: Артём | 
 
 | 
Сейчас: 4.11.2025, 16:52 |