Что нового

Можно ли сократить длинное условие с оператором Or?

SurikenTSD

Новичок
Сообщения
67
Репутация
1
В функции происходит чтение из ини-файла. Если один из параметров не получается достать, то везде возвращает значение "1".

Код:
Local $x = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu X", 1)
	Local $y = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Y", 1)
	Local $x2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Effects X", 1)
	Local $y2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Effects Y", 1)
	Local $smbx1 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Left Corner X", 1)
	Local $smby1 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Left Corner Y", 1)
	Local $smbx2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Right Corner X", 1)
	Local $smby2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Right Corner Y", 1)
	Local $x3 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Arrow Down X", 1)
	Local $y3 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Arrow Down Y", 1)


Дальше мне надо задать условие:
Код:
If "какая-либо из этих переменных имеет значение 1" then
msgbox(0, "Ошибка!", "Невозможно извлечь данные")


Переписывать If $x = 1 or $y = 1 or ... и тд - слишком длинно получается. Можно ли как-нибудь записать типа if $x, $y, ... or $y3 = 1 then ?
Или придется монотонно перечислять каждую перменную с использованием оператор "="?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Создайте массив переменных и проверяйте их в цикле.
 

AZJIO

Меценат
Меценат
Сообщения
2,756
Репутация
1,151
SurikenTSD

Изучайте это

Код:
Switch 1
	Case $x, $y, $z, 65 To 90, $a, $b
		MsgBox(0, 'Сообщение', 'ага, один из них равен 1')
EndSwitch
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,659
Репутация
2,457
В данном случае очень жаль что у переменных нет что то типа нумерации, т.е чтобы был макрос типа @NumVars.
 

XpycT

Скриптер
Сообщения
380
Репутация
132
SurikenTSD
Как вариант можно сделать так
Код:
Local $x = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu X", 1)
    Local $y = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Y", 1)
    Local $x2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Effects X", 1)
    Local $y2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Effects Y", 1)
    Local $smbx1 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Left Corner X", 1)
    Local $smby1 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Left Corner Y", 1)
    Local $smbx2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Right Corner X", 1)
    Local $smby2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Right Corner Y", 1)
    Local $x3 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Arrow Down X", 1)
    Local $y3 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Arrow Down Y", 1)

_Check($x, $y, $x2, $y2, $smbx1, $smby1, $smbx2, $smby2, $x3, $y3)
If @error Then msgbox(0, "Ошибка!", "Невозможно извлечь данные" & @CRLF & "@error = " & @error)

Func _Check($P1 = Null, $P2 = Null, $P3 = Null, $P4 = Null, $P5 = Null, $P6 = Null, $P7 = Null, $P8 = Null, $P9 = Null, $P10 = Null, $P11 = Null, $P12 = Null)
	For $p = 1 To @NumParams
		If Eval("P" & $p) = 1 Then Return SetError($p, 0, $p)
	Next
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,659
Репутация
2,457
XpycT [?]
Как вариант можно сделать так
Или так:

Код:
$GameInfoIniPath = @ScriptDir & '\test.ini'

Local $x = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu X", 1)
Local $y = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Y", 1)
Local $x2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Effects X", 1)
Local $y2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Effects Y", 1)
Local $smbx1 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Left Corner X", 1)
Local $smby1 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Left Corner Y", 1)
Local $smbx2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Right Corner X", 1)
Local $smby2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Right Corner Y", 1)
Local $x3 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Arrow Down X", 1)
Local $y3 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Arrow Down Y", 1)

If ($x + $y + $x2 + $y2 + $smbx1 + $smby1 + $smbx2 + $smby2 + $x3 + $y3) = 0 Then
	MsgBox(0, "Ошибка!", "Невозможно извлечь данные")
EndIf
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
XpycT,
ТС хочет УПРОСТИТЬ код. ;D

CreatoR,
Он отлавливает ситуацию когда хотя бы один параметр не введён.
imho, такая проверка не подходит.

Я бы сказал что AZJIO выиграл это конкурс. :thumbs_up:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,659
Репутация
2,457
C2H5OH [?]
Он отлавливает ситуацию когда хотя бы один параметр не введён
Кто он и что значит параметр не введён?

я показал как сделать то что хочет автор, не используя конструкцию «If ... Or ... Then».
Мой вариант эквивалентен этому:

Код:
If $x = 1 Or $y = 1 Or $x2 = 1 Or $y2 = 1 Or $smbx1 = 1 Or $smby1 = 1 Or $smbx2 = 1 Or $smby2 = 1 Or $x3 = 1 Or $y3 = 1 Then
	MsgBox(0, "Ошибка!", "Невозможно извлечь данные")
EndIf
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Он - это SurikenTSD (топик стартер)
Введён - присутствует в ini-файле.

Он читает значения переменных из ini-файла, и потом проверяет условие что хотя бы один параметр оказался со значением по умолчанию.

Не эквивалентен.
С булевыми переменными это прошло бы, но там числа.
Если сумма 10 чисел равна 0, это не означает что хотя бы одно из них равно 1.
:scratch:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,659
Репутация
2,457
C2H5OH [?]
Если сумма 10 чисел равна 0, это не означает что хотя бы одно из них равно 1.
Ты это проверял?
Я уверен что нет, т.к я проверял ;).
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,659
Репутация
2,457
Вообще подобное делается так:

Код:
Global $bError = False
Global $GameInfoIniPath = @ScriptDir & '\test.ini'

Local $x = _IniReadEx($GameInfoIniPath, "Coordinates of Objects", "Star Menu X", 1)
Local $y = _IniReadEx($GameInfoIniPath, "Coordinates of Objects", "Star Menu Y", 1)
Local $x2 = _IniReadEx($GameInfoIniPath, "Coordinates of Objects", "Star Menu Effects X", 1)
Local $y2 = _IniReadEx($GameInfoIniPath, "Coordinates of Objects", "Star Menu Effects Y", 1)
Local $smbx1 = _IniReadEx($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Left Corner X", 1)
Local $smby1 = _IniReadEx($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Left Corner Y", 1)
Local $smbx2 = _IniReadEx($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Right Corner X", 1)
Local $smby2 = _IniReadEx($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Right Corner Y", 1)
Local $x3 = _IniReadEx($GameInfoIniPath, "Coordinates of Objects", "Star Menu Arrow Down X", 1)
Local $y3 = _IniReadEx($GameInfoIniPath, "Coordinates of Objects", "Star Menu Arrow Down Y", 1)

If $bError Then
    MsgBox(0, "Ошибка!", "Невозможно извлечь данные")
EndIf

Func _IniReadEx($sFile, $sSection, $sKey, $sDefault)
	Local $sRet = IniRead($sFile, $sSection, $sKey, $sDefault)
	
	If $sRet == '1' Then
		$bError = True
	EndIf
	
	Return $sRet
EndFunc
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
CreatoR
мне кажется, ты что-то путаешь. предположим, первое число 1, остальные 0. тогда первая проверка
Код:
If ($x + $y + $x2 + $y2 + $smbx1 + $smby1 + $smbx2 + $smby2 + $x3 + $y3) = 0 Then
    MsgBox(0, "Ошибка!", "Невозможно извлечь данные")
EndIf

не выдаст сообщение. вторая же
Код:
If $x = 1 Or $y = 1 Or $x2 = 1 Or $y2 = 1 Or $smbx1 = 1 Or $smby1 = 1 Or $smbx2 = 1 Or $smby2 = 1 Or $x3 = 1 Or $y3 = 1 Then
    MsgBox(0, "Ошибка!", "Невозможно извлечь данные")
EndIf

выдаст. где-то надо поставить Not :smile:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Я - проверял.
Код:
Local $x = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu X", 1)
    Local $y = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Y", 1)
    Local $x2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Effects X", 1)
    Local $y2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Effects Y", 1)
    Local $smbx1 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Left Corner X", 1)
    Local $smby1 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Left Corner Y", 1)
    Local $smbx2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Right Corner X", 1)
    Local $smby2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Right Corner Y", 1)
    Local $x3 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Arrow Down X", 1)
    Local $y3 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Arrow Down Y", 1)

MsgBox(0,"введено", "$x = " & $x & @CR & "$y = " & $y & @CR & "$x2 = " & $x2 & @CR & "$y2 = " & $y2 & @CR & "$smbx1 = " & $smbx1 & @CR & "$smby1 = " & $smby1 & @CR & "$smbx1 = " & $smbx2 & @CR & "$smby2 = " & $smby2 & @CR & "$x3 = " & $x3 & @CR & "$y3 = " & $y3)
If ($x + $y + $x2 + $y2 + $smbx1 + $smby1 + $smbx2 + $smby2 + $x3 + $y3) = 0 Then
    MsgBox(0, "Ошибка!", "Невозможно извлечь данные")
Else
	MsgBox(0, "Нет ошибки", "Данные как буд-то корректные")
EndIf


А на чем основана твоя уверенность?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
А я бы примерно так сделал.
Код:
#include <Array.au3>

Global $sINI = @ScriptDir & '\test.ini', $sSection = 'Coordinates of Objects', $sDefault = 'Error', _
		$aINI[11][2] = [[10],['Star Menu X'],['Star Menu Y'],['Star Menu Effects X'], _
		['Star Menu Effects Y'],['Star Menu Box Left Corner X'],['Star Menu Box Left Corner Y'], _
		['Star Menu Box Right Corner X'],['Star Menu Box Right Corner Y'],['Star Menu Arrow Down X'], _
		['Star Menu Arrow Down Y']]

For $i = 1 To $aINI[0][0]
	$aINI[$i][1] = IniRead($sINI, $sSection, $aINI[$i][0], $sDefault)
	If $aINI[$i][1] == $sDefault Then $aINI[0][1] += 1
Next
If $aINI[0][1] Then
	MsgBox(16, 'Error', 'Не хватает ключей: ' & $aINI[0][1])
	Exit 13
EndIf
_ArrayDisplay($aINI)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
А если бы это мне нужно было, то я бы сделал вот так
Код:
Local $x = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu X", 0)
    Local $y = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Y", 0)
    Local $x2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Effects X", 0)
    Local $y2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Effects Y", 0)
    Local $smbx1 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Left Corner X", 0)
    Local $smby1 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Left Corner Y", 0)
    Local $smbx2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Right Corner X", 0)
    Local $smby2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Right Corner Y", 0)
    Local $x3 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Arrow Down X", 0)
    Local $y3 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Arrow Down Y", 0)

If ($x * $y * $x2 * $y2 * $smbx1 * $smby1 * $smbx2 * $smby2 * $x3 * $y3) = 0 Then
    MsgBox(0, "Ошибка!", "Невозможно извлечь данные")
Else
	MsgBox(0, "Нет ошибки", "Данные как буд-то корректные")
EndIf

:laugh:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,659
Репутация
2,457
Kaster [?]
где-то надо поставить Not
Ну да, это я игрался у себя в скрипте, изначально было <> 0, потом забыл вернуть.
Но факт в том что метод рабочий.
 
Верх