Перейти к контенту

Язык Lua. Общие вопросы программирования


Рекомендуемые сообщения

С чего начинать и где взять.

 

Установка Lua:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106

 

Руководство «Программирование на языке Lua», третье издание:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308

Изменено пользователем Kirgudu
Ссылка на комментарий

Всем привет! Нужна помощь. Используя пространство 

oi.

Создать алгоритм, который читает файл в текстовом режиме (если бы мы открыли файл блокнотом) и  находит в файле некую строку, возвращает последующие 4 символа после заданной строки.

Ссылка на комментарий

@Graff46,

В чём тебе нужна помощь? Ты фактически описал алгоритм:

  • Читать очередную строку, пока не кончится файл
  • в каждой строке искать нужную подстроку
  • если нашёл, то прибавить к найденной позиции длину строки и по полученной позиции прочитать подстроку из 4-х символов
Изменено пользователем Malandrinus
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

@Graff46,

for line in io.lines(<имя файла>) do

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

@Graff46, не совсем ясно - тебе нужно 4 символа непосредственно после первого вхождения заданной подстроки:

local file = io.open(path)
if file then
	result = file:read("*a"):match("substring(....)")
	file:close()
else
	print("can't read file: "..path)
end 

или первые 4 символа из строки, следующей за найденной. Во втором случае шаблон в match будет "substring.-\n(....)". Если искомая подстрока содержит магические символы, то их следует экранировать символом %.

 

  • Спасибо 1
Ссылка на комментарий

 

 

не совсем ясно - тебе нужно
в неком файле может содержаться три варианта выражения (в любой строке и в любой части строки) это seoson_osen1 , seoson_osen2 , seoson_win1.  Я хочу найти, в файле слово seoson_  и получить 5 (не 4, я ошибся) символа после т. е. либо osen1 либо osen2 или win1.
Ссылка на комментарий

Возможно кто-нибудь в курсе, как правильно называется следующая функция:

function clamp(n, min, max)
	if n < min then
		return max
	elseif n > max then
		return min
	else
		return n
	end
end
Пока обозвал clamp, но обычно clamp это запрет выхода за диапазон, а у меня значение идет по кругу. Не хочется путаться в дальнейшем с названиями.
Ссылка на комментарий
Тут точно скобки нужны?

В вызове функции всегда используются круглые скобки по дефолту во многих ЯП

Изменено пользователем User_X.A.R26
Ссылка на комментарий

@RayTwitty, это похоже на частный случай wrap. Частный потому, что не учитывает смещение при пересечении границы.

Wrap предполагает, что значение может выходить далеко за пределы минимума и максимума, и учитывает смещение.

@User_X.A.R26, замечу, что скорее всего имелись ввиду не оператор вызова, а скобки внутри строки-аргумента. А еще для Lua запись match "seoson_(%a+%d)" будет корректной, потому что если аргумент один и это строка, скобки можно не указывать. Вспомни функцию из luabind которая называется class. Так что не всегда используются круглые скобки.

  • Спасибо 2

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

у меня код 

local file = io.open(getFS():update_path("$app_data_root$", "savedgames\\") .. fname .. ".sav")
return file:read("*a"):match("osen")

не возвращает строку osen (в файле она точно есть). Методом проб и ошибок я вычислил, что файл читается только до второй строки.


Часть текстового кода файла который я мучаю

‘Э ’Э “Э ”Э •Э –Э —Э Э ™Э љЭ ›Э њЭ ќЭ ћЭ џЭ  Э ЎЭ ўЭ ЈЭ ¤Э ҐЭ ¦Э §Э ЁЭ ©Э ЄЭ «Э ¬Э ­Э ®Э ЇЭ °Э ±Э ІЭ іЭ ґЭ µЭ ¶Э ·Э ёЭ №Э єЭ »Э јЭ ЅЭ ѕЭ їЭ АЭ БЭ ВЭ ГЭ ДЭ ЕЭ ЖЭ ЗЭ ИЭ ЙЭ КЭ ЛЭ МЭ НЭ ОЭ ПЭ РЭ СЭ ТЭ УЭ ФЭ ХЭ ЦЭ ЧЭ ШЭ ЩЭ ЪЭ ЫЭ ЬЭ ЭЭ ЮЭ ЯЭ аЭ бЭ вЭ гЭ дЭ еЭ жЭ зЭ иЭ йЭ кЭ лЭ мЭ нЭ оЭ пЭ рЭ сЭ тЭ уЭ фЭ хЭ цЭ чЭ шЭ щЭ ъЭ ыЭ ьЭ эЭ юЭ яЮ  ЬяЭ Э Э Э Э Э Э Э Э 

Э Э Э 
Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э  Э !Э "Э #Э $Э %Э &Э 'Э (Э )Э *Э +Э ,Э -Э .Э /Э 0Э 1Э 2Э 3Э 4Э 5Э 6Э 7Э 8Э 9Э :Э ;Э <Э =Э >Э ?Э @Э AЭ BЭ CЭ DЭ EЭ FЭ GЭ HЭ IЭ JЭ KЭ LЭ MЭ NЭ OЭ PЭ QЭ RЭ SЭ TЭ UЭ VЭ WЭ XЭ YЭ ZЭ [Э \Э ]Э ^Э _Э `Э aЭ bЭ cЭ dЭ eЭ fЭ gЭ hЭ iЭ jЭ kЭ lЭ mЭ nЭ oЭ pЭ qЭ rЭ sЭ tЭ uЭ vЭ wЭ xЭ yЭ zЭ {Э |Э }Э ~Э Э ЂЭ ЃЭ ‚Э ѓЭ „Э …Э †Э ‡Э €Э ‰Э ЉЭ ‹Э ЊЭ ЌЭ ЋЭ ЏЭ ђЭ ‘Э ’Э “Э ”Э •Э –Э —Э Э ™Э љЭ ›Э њЭ ќЭ ћЭ џЭ  Э ЎЭ ўЭ ЈЭ ¤Э ҐЭ ¦Э §Э ЁЭ ©Э ЄЭ «Э ¬Э ­Э ®Э ЇЭ °Э ±Э ІЭ іЭ ґЭ µЭ ¶Э ·Э ёЭ №Э єЭ »Э јЭ ЅЭ ѕЭ їЭ АЭ БЭ ВЭ ГЭ ДЭ ЕЭ ЖЭ ЗЭ ИЭ ЙЭ КЭ ЛЭ МЭ НЭ ОЭ ПЭ РЭ СЭ ТЭ УЭ ФЭ ХЭ ЦЭ ЧЭ ШЭ ЩЭ ЪЭ ЫЭ ЬЭ ЭЭ ЮЭ ЯЭ аЭ бЭ вЭ гЭ дЭ еЭ жЭ зЭ иЭ йЭ кЭ лЭ мЭ нЭ оЭ пЭ рЭ сЭ тЭ уЭ фЭ хЭ цЭ чЭ шЭ щЭ ъЭ ыЭ ьЭ эЭ юЭ яЮ  ЬяЭ Э Э Э Э Э Э Э Э 
Э Э Э 
Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э  Э !Э "Э #Э $Э %Э &Э 'Э (Э )Э *Э +Э ,Э -Э .Э /Э 0Э 1Э 2Э 3Э 4Э 5Э 6Э 7Э 8Э 9Э :Э ;Э <Э =Э >Э ?Э @Э AЭ BЭ CЭ DЭ EЭ FЭ GЭ HЭ IЭ JЭ KЭ LЭ MЭ NЭ OЭ PЭ QЭ RЭ SЭ TЭ UЭ VЭ WЭ XЭ YЭ ZЭ [Э \Э ]Э ^Э _Э `Э aЭ bЭ cЭ dЭ eЭ fЭ gЭ hЭ iЭ jЭ kЭ lЭ mЭ nЭ oЭ pЭ qЭ rЭ sЭ tЭ uЭ vЭ wЭ xЭ yЭ zЭ {Э |Э }Э ~Э Э ЂЭ ЃЭ ‚Э ѓЭ „Э …Э †Э ‡Э €Э ‰Э ЉЭ ‹Э ЊЭ ЌЭ ЋЭ ЏЭ ђЭ ‘Э ’Э “Э ”Э •Э –Э —Э Э ™Э љЭ ›Э њЭ ќЭ ћЭ џЭ  Э ЎЭ ўЭ ЈЭ ¤Э ҐЭ ¦Э §Э ЁЭ ©Э ЄЭ «Э ¬Э ­Э ®Э ЇЭ °Э ±Э ІЭ іЭ ґЭ µЭ ¶Э ·Э ёЭ №Э єЭ »Э јЭ ЅЭ ѕЭ їЭ АЭ БЭ ВЭ ГЭ ДЭ ЕЭ ЖЭ ЗЭ ИЭ ЙЭ КЭ ЛЭ МЭ НЭ ОЭ ПЭ РЭ СЭ ТЭ УЭ ФЭ ХЭ ЦЭ ЧЭ ШЭ ЩЭ ЪЭ ЫЭ ЬЭ ЭЭ ЮЭ ЯЭ аЭ бЭ вЭ гЭ дЭ еЭ жЭ зЭ иЭ йЭ кЭ лЭ мЭ нЭ оЭ пЭ рЭ сЭ тЭ уЭ фЭ хЭ цЭ чЭ шЭ щЭ ъЭ ыЭ ьЭ эЭ юЭ яЮ   ЬяЭ Э Э Э Э Э Э Э Э 
Э Э Э 
Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э  Э !Э "Э #Э $Э %Э &Э 'Э (Э )Э *Э +Э ,Э -Э .Э /Э 0Э 1Э 2Э 3Э 4Э 5Э 6Э 7Э 8Э 9Э :Э ;Э <Э =Э >Э ?Э @Э AЭ BЭ CЭ DЭ EЭ FЭ GЭ HЭ IЭ JЭ KЭ LЭ MЭ NЭ OЭ PЭ QЭ RЭ SЭ TЭ UЭ VЭ WЭ XЭ YЭ ZЭ [Э \Э ]Э ^Э _Э `Э aЭ bЭ cЭ dЭ eЭ fЭ gЭ hЭ iЭ jЭ kЭ lЭ mЭ nЭ oЭ pЭ qЭ rЭ sЭ tЭ uЭ vЭ wЭ xЭ yЭ zЭ {Э |Э }Э ~Э Э ЂЭ ЃЭ ‚Э ѓЭ „Э …Э †Э ‡Э €Э ‰Э ЉЭ ‹Э ЊЭ ЌЭ ЋЭ ЏЭ ђЭ ‘Э ’Э “Э ”Э •Э –Э —Э Э ™Э љЭ ›Э њЭ ќЭ ћЭ џЭ  Э ЎЭ ўЭ ЈЭ ¤Э ҐЭ ¦Э §Э ЁЭ ©Э ЄЭ «Э ¬Э ­Э ®Э ЇЭ °Э ±Э ІЭ іЭ ґЭ µЭ ¶Э ·Э ёЭ №Э єЭ »Э јЭ ЅЭ ѕЭ їЭ АЭ БЭ ВЭ ГЭ ДЭ ЕЭ ЖЭ ЗЭ ИЭ ЙЭ КЭ ЛЭ МЭ НЭ ОЭ ПЭ РЭ СЭ ТЭ УЭ ФЭ ХЭ ЦЭ ЧЭ ШЭ ЩЭ ЪЭ ЫЭ ЬЭ ЭЭ ЮЭ ЯЭ аЭ бЭ вЭ гЭ дЭ еЭ жЭ зЭ иЭ йЭ кЭ лЭ мЭ нЭ оЭ пЭ рЭ сЭ тЭ уЭ фЭ хЭ цЭ чЭ шЭ щЭ ъЭ ыЭ ьЭ эЭ юЭ яЮ  !ЬяЭ Э Э Э Э Э Э Э Э 
Э Э Э 
Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э Э  Э !Э "Э #Э $Э %Э &Э 'Э (Э )Э *Э +Э ,Э -Э .Э /Э 0Э 1Э 2Э 3Э 4Э 5Э 6Э 7Э 8Э 9Э :Э ;Э <Э =Э >Э ?Э @Э AЭ BЭ CЭ DЭ EЭ FЭ GЭ HЭ IЭ JЭ KЭ LЭ MЭ NЭ OЭ PЭ QЭ RЭ SЭ TЭ UЭ VЭ WЭ XЭ YЭ ZЭ [Э \Э ]Э ^Э _Э `Э aЭ bЭ cЭ dЭ eЭ fЭ gЭ hЭ iЭ jЭ kЭ lЭ mЭ nЭ oЬ  ,   DЕ7 nD  g actor single_player  юОЛЎВB)qА@цЅВјqЌ;wёІї]4єlwяяяя) v  Ђ?tј М WH0? Вы <rЂ x 4xrs_armor_t   qGseason osen2 l01_escape Ђ2  Ч ‰$  E  ѕ  5  2L Z  ђUL=  l  \  Ѓ  /M.L f  :  A\
д  Я  Љ  9\”@  k\  PMЪ\}  Х] m]BMЭMe\
в  c]] )M^Md] ЋM
ЄM
YMрM%]T]
ЫMl]ТLw  cM,L®MSMі]zM`M ё]y\ x  v]uM ­]»M tM<MsMSMIMµMrMЌ]q\ •  p]
jM єL’o\Ѕ  nM‚MаM·]8M©M…]7M6M¬]M] 4]Л]?M1],ЂM-M+] *MYM(M¶M'] &M‘M
Ё]оMСM"]ЮLh  _] ]
|M
§M]] ѓLљ  м]]–ML] ¦]
g]«] OMb]a]GL Џ^]<!M
°]RM]MґM_]QM\MОMJM[M {MeMW]Ч]VMЊMXM›] PM 0MFM ~M$H]
ЙM!]M-У]/3]„M]“]U]#MiM€]h]н]
†]K|M5D] RM І]`]]"aM‡Md];Ц]РMW]ЬM;MЇ] [M—MШMпM
НM"М]X]™MZ]ј]CMК] ‹]
Q] V]бM>MФM±MNM
g]№]Щ] ]г] ПMf\ ”ecolog_monster_part_2 normal Ђ  freedom_kill_stalker_4-ђ  dolg_defend_lager_1-„ sar_secret_lab-p val_prisonThelp- milјcontroller-„ Ђeliminateм.›tm_(Њ camp_5-ф- .Qt-<.| ш+С6-¬'Tsnip/Dи-$.Hagr_d&й3s1ђcourier_jo.а esc_blockpost_case_to_trad/<yan_find_scientist-¤21 3-Њ pprovodnik_task-Ђ XopromЁ
gunslin|Icache-° Д(„'й *p†ght1Ф0_3 +0… 1-„ bar_resque_infoBhti`Ы30
(И3
barmen>¬
d x16_document.и5 .fgaЗHdym/АД+. М€,artefac0.Д.б
tИ>' . 3…7-D3‘ 15А- ,.ШИP+.Њ |O'Р_return;м get_military7tt?
community_que/Tp”7brai3ШЂ arklab:°`RДјЊV.Иxcrazy_veterans3<0 
1 l
-t5€фТ.$L
+`.| аd+ђ 5 ,t.€Ђ1(Дјђ2рvasilyev2pВяrg62€ 2М .ґ3L5ђ *T.фx(ѓjob.А
+5Њ (|ЂH.4ф- .Фx•
car_graveyard6 +h.р
М 6.Ь1м/x$Ь=РDQ-„ .цdo"6_mee._hun"p&(ь ђ-а"{%war0h%mercen`‰*<-ф drunk_ђXЂTitem-€ l!Њ(&se^tov-  3d.X
-E_.Њ dar_codedoor/Ь`SҐ#s2Њ3‚105¬Ђq_.ММmЂ'h.ђ zastava_d±ander)д2°3P.H.А.РАO<dwolf.0/h.garbageЊO&)-Ўa&—)kro.|
3Њ.(
"‡/sos#Ё*-l. .`%Ф%.ґ2„captive2”xУ0x&/X 3Ь.Ёи\(HЂљ. !tutorial_wounded.рм+.‘ m,€6.4

5<1Д­|b"њ/rule.Д(p$°j_rifl.ј-.¤./'. МV*$/631. gLѓboar.ДF€*”z.*Ђ 'T.ђ 0М.ЂШ+м.esc+ю

поправлено

Изменено пользователем Graff46
Ссылка на комментарий

у меня код

Покажи-ка лучше целиком функцию, а то не шибко понятно к чему этот твой return вообще относится\внутри чего находится Изменено пользователем User_X.A.R26
Ссылка на комментарий

@User_X.A.R26

 

function load_dialog:load_game_internal()	
	local console = get_console()
	local list = self:GetListWnd("list_window")	

	if list:GetSize()==0 then return end

	local index = list:GetSelectedItem()
	
	if index == -1 then return end
		
	local item  = list:GetItem(index)
	local fname = item.fn:GetText()
	
	if (alife() == nil) then
		local file = io.open(getFS():update_path("$app_data_root$", "savedgames\\") .. fname .. ".sav")
		get_console():execute(file:read("*a"):match("osen")) --"seoson_%a+%d"))
		--file:close()
		console:execute	("disconnect")	
		console:execute	("start server(" .. fname .. "/single/alife/load) client(localhost)")	
	else
		console:execute	("load " .. fname)	
	end
end
 

 

 

Ссылка на комментарий

@Graff46, вроде бы с самим шаблоном косяк


Ещё можно глянуть вот это, кстати. Там указаны и функции работы с различиями Изменено пользователем User_X.A.R26
Ссылка на комментарий

@User_X.A.R26, каким шаблоном?  Единственный поиск по шаблону - закоментирован


Да и поиск работает, только не дальше первой строки в файле почему то

Изменено пользователем Graff46
Ссылка на комментарий

Пока обозвал clamp, но обычно clamp это запрет выхода за диапазон, а у меня значение идет по кругу

Где же здесь по кругу? По кругу - это остаток от деления, а у тебя вообще не понять что.

 

@Graff46,

зачем тебе match? Ты ищешь строго одну и ту же строку. Поиск по шаблону будет переусложнением и перерасходом ресурсов. Используй обычный string.find

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

@User_X.A.R26, Я тут провел эксперимент.  На одном из форумов я нашел код для копирования файлов основанный как раз то на чтении и копировании 

 

    local source = io.open(source_path)  
    local dest = io.output(dest_path)  
    dest:write(source:read("*a"))  
    source:close()  
    dest:close() 

 

А вот мой код 

local source = io.open(getFS():update_path("$app_data_root$", "savedgames\\osen2.sav"))  
    local dest = io.output(getFS():update_path("$app_data_root$", "seoson.ini"))  
    dest:write(source:read("*a"))  
    source:close()  
    dest:close()

Но когда я выполнил код то в копии (в файле seoson.ini) было лишь 

яяяя   Ъ>9              L аОz»Ѕ9@
  A   A   ¤t       all љЂИ2‘sЏBі;5ђ<кХDuЂН L|} p Ьhl
| l
} p    Э Э 	Э 
Э Э Э 
Э Э Ь |ip    Э Ь |ip    Э Э Э Э 

Хотя в исходном файле текста почти на мегабайт. Что то обрывает чтение в строках, может пробелы какие или пустоты...?

Malandrinus да это я от безысходности, я делаю

 

в неком файле может содержаться три варианта выражения (в любой строке и в любой части строки) это seoson_osen1 , seoson_osen2 , seoson_win1.  Я хочу найти, в файле слово seoson_  и получить 5 (не 4, я ошибся) символа после т. е. либо osen1 либо osen2 или win1.

когда работать не стало, я просто искал кусок строки. Да и смысл уже в том, что файл криво читается и тут дело не в строках получается...

Изменено пользователем Graff46
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...