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

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


Malandrinus

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

Помогите, плиз, с регэкспом для string.match: "(все, что не charset)(все, что после charset)"

Оно такое вообще возможно ?

 

Пример: на входе имеем "а_вот_такая_вот_фигня_1 | и_вот_такая_2", надо получить отдельно "а_вот_такая_вот_фигня_1" и "и_вот_такая_2", но на самом деле они могут быть разделены чем угодно, и известно только то, что собственно символов разделителя в искомых подстроках нет. Ага, разделителем может быть несколько символов в любом количестве и последовательности. В подстроках могут быть вообще любые символы, кроме символов, входящих в состав разделителя.

 

Вариант найти собственно разделитель, а потом вырезать подстроку до него, и подстроку после - очевиден, но неинтересен.

Изменено пользователем Dennis_Chikin

Поделиться этим сообщением


Ссылка на сообщение

Любые - в том смысле, что не обязательно %w.

В каждый момент написания регэкспа мы знаем, каких там точно быть не может.

 

В идеале, если бы (.*)[разделитель1разделитель2разделитель3]*(.*) обрабатывалось бы как единое целое - в смысле, .* - это любые символы, кроме искомого - было бы то, что надо.

Поделиться этим сообщением


Ссылка на сообщение

malandrinus,

а "символы строки" определить, как противоположность "символов разделителей"

Вот это и пытаюсь. Но, похоже, что-то не то делаю. Не работает.

 

Gun12, разделители известны. Да, .* в lua работает не так, как надо мне.

По логике в lua должно быть что-то типа s1, s2 = string.match( s, "([^раздедитель]*)[разделитель]*(.*)" ) ), где разделителей несколько, но оно почему-то тоже не работает.

С разделителем из одного символа - работает. С одним или более из нескольких - нет.

Поделиться этим сообщением


Ссылка на сообщение

О, кажется, я понял:

То есть, надо писать именно [^"строка"], а не [^символ^символ^символ] ?

 

А конфиги трогать нельзя. Это будет оскорбление чуйств верующих.

Изменено пользователем Dennis_Chikin

Поделиться этим сообщением


Ссылка на сообщение

This question is too "wide" and unclear. It seems that You need tutorials on Your native language...

 

Common solution would look as something like this:

 

1. try find out appropriate update function for appropriate object.

2. add checking code for desired weapon's section or name.

3. now, You need to store the time or the time-out if the weapon is active, or reset it to false otherwise, and  disable the weapon if required.

local wnp = self.object:active_weapon()
if wpn and wpn:section() == "our_section" then
  if self.wpn_check_time then
    if self.wpn_check_time < self.device():time_global() then
       disable_wpn( self.object ) -- You MUST define this function somewhere as You need
    end
  else self.wpn_check_time = self.device():time_global() + TIME_WHAT_YOU_NEED
  end
else self.wpn_check_time = false
end

 

Изменено пользователем Dennis_Chikin

Поделиться этим сообщением


Ссылка на сообщение

DDamian724,

 

It's not complete script. It's just a example.

As 1-st step, You must determine to Yourself what You actually need, in details.

Second, appropriate place for modification must be found and examined closely.

If You mean to modify the actor - yes, function bind_stalker.update() seems to be good to be modifyed. Examine this function again: here can be something like what You want.

Then, yes, consult with the "Programming in Lua" manual and make chages, one-by-one.

 

I not see the code which You try to modify nor know version or modifications which was added before, and can't suggest details.

 

And, yes, there is lot of methods to "disable" weapon:

disable weapons completely (look bind_stalker.script for something like "self.object:hide_weapon()" or "self.weapon_hide" strings);

select another active slot or item;

simple release the weapon object completely;

so on...

Изменено пользователем Dennis_Chikin

Поделиться этим сообщением


Ссылка на сообщение

Это не Lua, а особеность эксрэя. Причем, как бы даже не ЗП-шного.

Для интереса попробовать в 3-й строке не se_item:use_ai_locations(true), а опять же item:use_ai_locations(true) - что будет ?

Поделиться этим сообщением


Ссылка на сообщение

Если говорить не о языке вообще, а о вполне конкретном сталкере (и конкретном ТЧ) в частности, то if not var then сработает в случае, если var == nil, var == false, а также, ВНИМАНИЕ, var - результат return без аргумента.

 

if var == nil then сработает  только тогда, когда var действительно == nil.

 

If var then - любое var кроме случая, описанного в п1.

if var == true then - только если var действительно == true.

 

Несколько раз очень забавно нарывался на п1.

  • Не нравится 1

Поделиться этим сообщением


Ссылка на сообщение

local t = { ... }

local n = #t

local tt = {}

local r

for i = 1,5 do

if n < 1 then break end

r = math.random( n )

tt = t[r]

table.remove( t, r )

n = n - 1

end

Изменено пользователем Dennis_Chikin

Поделиться этим сообщением


Ссылка на сообщение

После table.remove( t, r ) ни каких "дырок" быть не должно. Это не t[r] = nil.

 

В общем, и во втором случае - это из серии "ну так не запрещено же, вот мы и впендюрили, чтоб вы все затрахались !"

Но в первом - такое поведение - явная ошибка разработчиков конкретного компилятора. Должно быть переиндексирование.

Поделиться этим сообщением


Ссылка на сообщение

а значит твой код косячит именно там где я и указал выше

Тебе шашечки, или ехать ?

Берем значение по индексу, и перекладываем. Всю запись удаляем. Если еще раз выпадает тот же индекс, там будет уже другое значение, которое опять же перекладывается. Что еще надо ?

 

Не меняя качество рэндома, можно сделать только так, и ни как иначе. (Варианты только - делать непосредственно в теле кода, или отдельной функцией, как у Desertir.)

 

Если надо, чтобы исходная таблица сохранялась тоже - либо копируем всю таблицу, либо - заводим еще одну, в формате slected[v] = true, и повторный рандом, если попали на помеченное.

 

Больше, собственно, ни как, при имеющейся постановке задачи.

 

 

P.S. А "сарказм" на самом деле относится к тому, что t = nil в сталкеровской реализации LUA таблицу просто гарантированно разрушает.

Изменено пользователем Dennis_Chikin

Поделиться этим сообщением


Ссылка на сообщение

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

 

Установка 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

Поделиться этим сообщением


Ссылка на сообщение

local test_s1 = ""

local test_s2 = ""

local test_i = 0

 

function test( v ) end

 

for i = 1, 10000 do test_s1 = test_s1 .. " " end

 

local pt = profile_timer()

pt:start()

for i = 1, 10000 do test ( test_s1 ) end

pt:stop()

log( "info", "string 200000: %s", pt:time() )

 

local pt = profile_timer()

pt:start()

for i = 1, 10000 do test ( test_s2 ) end

pt:stop()

log( "info", "string 0: %s", pt:time() )

 

local pt = profile_timer()

pt:start()

for i = 1, 10000 do test ( test_i ) end

pt:stop()

log( "info", "int: %s", pt:time() )

 

 

string 200000: 30992.1328125

string 0: 231.48368835449

int: 216.08390808105

 

Таки да, действительно копирует. Прощай очередной "оптимизаторский" миф про "строки существуют только в одном экземпляре".

Поделиться этим сообщением


Ссылка на сообщение

2 Desertir: только код смотреть. Адреса же нам принципиально не показывают в явном виде.

 

Собственно, имея в виду (господи, как же это и назвать-то теперь, чтоб очередной страницы флуда не получить) - ну, вы поняли - я бы вообще сделал банально:

 

Если что-то передается в функцию - передается адрес (у нас внутри все равно не регистровые операции, а если и регистровые, то с предварительной загрузкой из стека). То есть, пока нет присваивания - по этому адресу и получаем. Как только присваивание - создаем новую переменную, и указатель выставляем на нее.

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

 

 

2 abramcumner: ожидаемо, 246 для таблицы (vs 212 и 212 для "" и 0 ).

Изменено пользователем Dennis_Chikin

Поделиться этим сообщением


Ссылка на сообщение

Что-то задумался:

А есть ли вариант захвата типа (%b()), но для случая, когда искомых () может быть, а может и не быть (и быть что-то другое, которое и захватывать надо иначе) ?

 

Это все к тому же вопросу об xr_logic.parse_infop()

 

Соблазнительно разрешить в аргументах пробелы.

Поделиться этим сообщением


Ссылка на сообщение

" +test( 34: 55 56 : 57:66 ) -test1 +test2(test0 )"

 

Мне, пожалуйста,

+, test, 34: 55 56 : 57:66

-, test1

+, test2, test0

 

для 2-й строки третьим захватом можно хоть nil, хоть "" - без разницы.

Изменено пользователем Dennis_Chikin

Поделиться этим сообщением


Ссылка на сообщение

А проверить ? Если б работало - не спрашивал бы.

 

В общем, я посмотрел на получающееся у меня

for v1, v2, v3 in string.gfind( s, "(%S)([^%s%(%-%+%~%=%!]+)%s*%(?([^%)%-%+%~%=%!]*)%)?" ) do

 

и понял, что лучше таки в два приема, с

for v1, v2 in string.gfind( s, "(%S)([^%-%+%~%=%!]+)" ) do

...else

v1, v2 = string.match( v2, "([^%s%(]+)%s*%(?([^%)]*)" )

Если v1 == "=" или "!".

Так, пожалуй, все-таки и быстрее, и вменяемее.

Изменено пользователем Dennis_Chikin

Поделиться этим сообщением


Ссылка на сообщение

Код странен. Я вообще не понял, что он должен делать.

 

"RUNTIME ERROR - no static '_update' in class 'actor_binder'" - именно так, да.

 

 

local s = "_" .. fn
local binder = _G.bind_stalker.actor_binder
local t = binder[s]
if not t then
	t = {}
	binder[s] = t
	if narg==1 then
		t[1] = binder[fn]
		binder[fn] = function(...)
		for _,f in pairs ( t ) do
			f(...) end
		end
binder[fn] = function(...) - вот это вот что и зачем ?

И зачем в цикле пытаться вызвать как функцию единственный элемент какой-то таблицы, который вообще то-ли есть, то-ли нет ?

Изменено пользователем Dennis_Chikin

Поделиться этим сообщением


Ссылка на сообщение

Вообще-то стоит еще понимать разницу между интерпретируемым и компилируемым кодом.

И помнить, что такое инлайн, и где он есть, а где его нет.

 

P.S. Идея копировать строки при передаче в функцию - явно не гуманности ради была реализована.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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