Что нового

[Массивы] Не работает обработка массивов на основании пользовательских правил

konokrad666

Новичок
Сообщения
22
Репутация
0
Функция принимает набор числовых параметров и согласно правилам, заданным пользователем возвращает массив - строку с именем категории и айди категории.

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

Ини файл с правилами и именами категорий:
Код:
[rules]
Blocking=(count=0)
normal=(itm<49)(count>100)
Zero=(itm<=53)(itm>=49)(Money>1000)
Registered=(itm<=56)(itm<=53)(count>100)
warrior=(Ability>77)(count>100)
Lowcount=(count<100)

[labels]
Lowcount=10
normal=1
Zero=8
Registered=6
warrior=9
Blocking=14
unlocked=11

Вот сама функция:
Код:
Func GetPlayerCategory ($count, $itm, $ABI, $Ability, $Money)
	Local $category[2]
	Local $assigned = False
	$rules = IniReadSection ( "rules.ini", "rules" )
	for $i = 1 to Ubound($rules, 1)
		$rules[$i][1] = StringTrimRight( StringTrimLeft( $rules[$i][1], 1 ), 1 )
		$expressions = StringSplit ( $rules[$i][1], ")(" , 1 )
		$Number_true = 0
		for $a = 1 to UBound ($expressions)
			if Execute ("$" & $expressions[$a]) == True Then
			$Number_true = $Number_true + 1
			EndIf
		Next
		if $Number_true == UBound ($expressions) Then
			$category[0] = $rules[$i][0]
			$category[1] = IniRead("rules.ini", "labels", $category[0], -1)
			$assigned = True
			ExitLoop

		EndIf
	Next
	If $assigned == True Then
	Return $category
	Else
	$category[0] = 'Out of rules'
	$category[1] = 666
	Return $category
	EndIf
EndFunc


Заранее спасибо.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
konokrad666
Странно что параметры у функции идут "лесом", что именно ей нужно отправлять что бы получить различные рез-ты?


Добавлено:
Сообщение автоматически объединено:

Код:
#include<Array.au3>
$l=__GetPlayerCategory(1,1,1,1,1)
_ArrayDisplay($l)
Func __GetPlayerCategory ($count, $itm, $ABI, $Ability, $Money)
    Local $category[2]
    Local $assigned = False
    $rules = IniReadSection ( "1.ini", "rules" )
;~ 	_ArrayDisplay($rules)
    for $i = 1 to Ubound($rules, 1)-1
        $rules[$i][1] = StringTrimRight( StringTrimLeft( $rules[$i][1], 1 ), 1 )
;~ 		MsgBox(0,'',$rules[$i][1])
        $expressions = StringSplit ( $rules[$i][1], ")(" ,1)
;~ 		_ArrayDisplay($expressions)
        Local $Number_true = 0
        for $a = 1 to UBound ($expressions)-1
            if Execute ("$" & $expressions[$a]) == True Then
            $Number_true = $Number_true + 1
            EndIf
        Next
;~ 		MsgBox(0,'',$Number_true)
        if $Number_true = UBound ($expressions)-1 Then
            $category[0] = $rules[$i][0]
            $category[1] = IniRead("1.ini", "labels", $category[0], -1)
            $assigned = True
            ExitLoop
        EndIf
    Next
    If $assigned = True Then
		Return $category
    Else
		$category[0] = 'Out of rules'
		$category[1] = 666
		Return $category
    EndIf
EndFunc

Может быть вот так?
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Или так:
Код:
Func GetPlayerCategory($count, $itm, $ABI, $Ability, $Money)
	Local $category[2]
	Local $assigned = False
	$rules = IniReadSection("rules.ini", "rules")
	For $i = 1 To UBound($rules, 1) - 1
		$rules[$i][1] = StringTrimRight(StringTrimLeft($rules[$i][1], 1), 1)
		$expressions = StringSplit($rules[$i][1], ")(", 1)
		$Number_true = 0
		For $a = 1 To UBound($expressions) - 1
			If Execute('$' & $expressions[$a]) = True Then
				$Number_true = $Number_true + 1
			EndIf
		Next
		If $Number_true = UBound($expressions) - 1 Then
			$category[0] = $rules[$i][0]
			$category[1] = IniRead("rules.ini", "labels", $category[0], -1)
			$assigned = True
			ExitLoop
		EndIf
	Next
	If $assigned = True Then
		Return $category
	Else
		$category[0] = 'Out of rules'
		$category[1] = 666
		Return $category
	EndIf
EndFunc   ;==>GetPlayerCategory


PS. Этот Ваш код это нечто... Не проще было просто попросить создать функцию для решения Вашей задачи? :-X
 
Автор
K

konokrad666

Новичок
Сообщения
22
Репутация
0
Нет, не работает.
В целом, функция должна возвратить имя ключа, из значения которого сработали все параметры.
т.е вызов
Код:
GetPlayerCategory(1, 50, 1, 1, 1001)

должен вернуть
Код:
$category[0] == "Zero"
$category[1] == 8

Как это сделано:
Код:
Zero=(itm<=53)(itm>=49)(Money>1000)

Код:
if Execute ("$" & $expressions[$a]) == True Then
            $Number_true = $Number_true + 1


эти две строчки берут правило, приклеивают спереди знак переменной, выходит Execute ($itm>=49)
Потом считается количество сработавших правил, если оно равно общему количеству правил, т.е. все правила (itm<=53)(itm>=49)(Money>1000) выполнились одновременно, тогда возвращает название текущего элемента массива "Zero" и его айди.

PS. Этот Ваш код это нечто... Не проще было просто попросить создать функцию для решения Вашей задачи? :-X
Я создавал тему когда-то, мне помогли, но в принципе работы решения я тогда так и не разобрался до конца, а сейчас надо было изменить формат и разделители правил, так что я решил написать с нуля самостоятельно.
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
konokrad666
У меня этот момент срабатывает:
Код:
$ah = GetPlayerCategory(1, 50, 1, 1, 1001)
MsgBox(0,'',$ah[0]&'='&$ah[1])
Func GetPlayerCategory($count, $itm, $ABI, $Ability, $Money)
	Local $category[2]
	Local $assigned = False
	$rules = IniReadSection("rules.ini", "rules")
	For $i = 1 To UBound($rules, 1) - 1
		$rules[$i][1] = StringTrimRight(StringTrimLeft($rules[$i][1], 1), 1)
		$expressions = StringSplit($rules[$i][1], ")(", 1)
		$Number_true = 0
		For $a = 1 To UBound($expressions) - 1
			If Execute('$' & $expressions[$a]) = True Then
				$Number_true = $Number_true + 1
			EndIf
		Next
		If $Number_true = UBound($expressions) - 1 Then
			$category[0] = $rules[$i][0]
			$category[1] = IniRead("rules.ini", "labels", $category[0], -1)
			$assigned = True
			ExitLoop
		EndIf
	Next
	If $assigned = True Then
		Return $category
	Else
		$category[0] = 'Out of rules'
		$category[1] = 666
		Return $category
	EndIf
EndFunc   ;==>GetPlayerCategory

PS. Не сочтите за оскорбление. Заметно преобладание С++. Я тоже начинал с С++. Друзья всегда меня материли. Т.е. вроде работает, но как работает не понятно... ;D
 
Автор
K

konokrad666

Новичок
Сообщения
22
Репутация
0
Исправил, дело было в том что мой ини файл был в UTF-8 :stars:
Всем спасибо.
 
Верх