Что нового

Не срабатывает перебор массива после проверки значений при записи в новый массив

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Доброго времени суток. Есть два рабочих варианта заполнения массива.
Вариант 1 (сокращенный)
Код:
[URL='https://autoit-script.ru/docs/keywords/include.htm']#include[/URL] <Constants.au3>
[URL='https://autoit-script.ru/docs/keywords/include.htm']#include[/URL] <Array.au3>
[URL='https://autoit-script.ru/docs/keywords/dim.htm']Const[/URL] $wbemFlagReturnImmediately = 0x10
[URL='https://autoit-script.ru/docs/keywords/dim.htm']Const[/URL] $wbemFlagForwardOnly = 0x20
[URL='https://autoit-script.ru/docs/keywords/dim.htm']Global[/URL] $Smart[0][8]
[URL='https://autoit-script.ru/docs/keywords/dim.htm']Global[/URL] $sTemp, $sTemp231, $sTemp1
[URL='https://autoit-script.ru/docs/keywords/dim.htm']Local[/URL] $sPark, $sP, $sT
[URL='https://autoit-script.ru/docs/keywords/dim.htm']Local[/URL] $objWMIService = [URL='https://autoit-script.ru/docs/functions/objget.htm']ObjGet[/URL]("winmgmts:\\" & [URL='https://autoit-script.ru/docs/macros.htm']@ComputerName[/URL] & "\root\WMI")
[URL='https://autoit-script.ru/docs/keywords/dim.htm']Local[/URL] $colItems = $objWMIService.ExecQuery("SELECT * FROM MSStorageDriver_ATAPISmartData", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
[URL='https://autoit-script.ru/docs/keywords/dim.htm']Local[/URL] $iCnt = 1, $strReserved, $strVendorSpecific
[URL='https://autoit-script.ru/docs/keywords/for.htm']For[/URL] $Item [URL='https://autoit-script.ru/docs/keywords/in.htm']In[/URL] $colItems
$strReserved = $Item.Reserved
$strVendorSpecific = $Item.VendorSpecific
$iCnt += 1
[URL='https://autoit-script.ru/docs/keywords/for.htm']Next
For[/URL] $i = 2 [URL='https://autoit-script.ru/docs/keywords/for.htm']To[/URL] [URL='https://autoit-script.ru/docs/functions/ubound.htm']UBound[/URL]($strVendorSpecific) - 1 [URL='https://autoit-script.ru/docs/keywords/for.htm']Step[/URL] 12
[URL='https://autoit-script.ru/docs/keywords/if.htm']If[/URL] $strVendorSpecific[$i] = 0 [URL='https://autoit-script.ru/docs/keywords/if.htm']Then[/URL] [URL='https://autoit-script.ru/docs/keywords/continueloop.htm']ContinueLoop[/URL]
[URL='https://autoit-script.ru/docs/keywords/if.htm']If[/URL] $strVendorSpecific[$i] = 1 [URL='https://autoit-script.ru/docs/keywords/if.htm']Then[/URL] $sPark = $strVendorSpecific[$i] & '|' & $strVendorSpecific[$i + 1] & '|' & $strVendorSpecific[$i + 2] & '|' & $strVendorSpecific[$i + 3] & '|' & $strVendorSpecific[$i + 4] & '|' & $strVendorSpecific[$i + 5] & '|' & $strVendorSpecific[$i + 6]
[URL='https://autoit-script.ru/docs/keywords/if.htm']If[/URL] $strVendorSpecific[$i] = 2 [URL='https://autoit-script.ru/docs/keywords/if.htm']Then[/URL] $sP = $strVendorSpecific[$i] & '|' & $strVendorSpecific[$i + 1] & '|' & $strVendorSpecific[$i + 2] & '|' & $strVendorSpecific[$i + 3] & '|' & $strVendorSpecific[$i + 4] & '|' & $strVendorSpecific[$i + 5] & '|' & $strVendorSpecific[$i + 6]
[URL='https://autoit-script.ru/docs/keywords/if.htm']If[/URL] $strVendorSpecific[$i] = 3 [URL='https://autoit-script.ru/docs/keywords/if.htm']Then[/URL] $sT = $strVendorSpecific[$i] & '|' & $strVendorSpecific[$i + 1] & '|' & $strVendorSpecific[$i + 2] & '|' & $strVendorSpecific[$i + 3] & '|' & $strVendorSpecific[$i + 4] & '|' & $strVendorSpecific[$i + 5] & '|' & $strVendorSpecific[$i + 6]
[URL='https://autoit-script.ru/docs/keywords/if.htm']If[/URL] $strVendorSpecific[$i] = 194 [URL='https://autoit-script.ru/docs/keywords/if.htm']Then[/URL] $sTemp = $strVendorSpecific[$i] & '|' & $strVendorSpecific[$i + 1] & '|' & $strVendorSpecific[$i + 2] & '|' & $strVendorSpecific[$i + 3] & '|' & $strVendorSpecific[$i + 4] & '|' & $strVendorSpecific[$i + 5] & '|' & $strVendorSpecific[$i + 6]
[URL='https://autoit-script.ru/docs/keywords/if.htm']If[/URL] $strVendorSpecific[$i] = 231 [URL='https://autoit-script.ru/docs/keywords/if.htm']Then[/URL] $sTemp231 = $strVendorSpecific[$i] & '|' & $strVendorSpecific[$i + 1] & '|' & $strVendorSpecific[$i + 2] & '|' & $strVendorSpecific[$i + 3] & '|' & $strVendorSpecific[$i + 4] & '|' & $strVendorSpecific[$i + 5] & '|' & $strVendorSpecific[$i + 6]
[URL='https://autoit-script.ru/docs/keywords/for.htm']Next[/URL]

[URL='https://autoit-script.ru/docs/keywords/if.htm']If[/URL] [URL='https://autoit-script.ru/docs/functions/stringstripws.htm']StringStripWS[/URL]($sPark, 8) <> '' [URL='https://autoit-script.ru/docs/keywords/if.htm']Then[/URL] [URL='https://autoit-script.ru/docs/libfunctions/_arrayadd.htm']_ArrayAdd[/URL]($Smart, $sPark)
[URL='https://autoit-script.ru/docs/keywords/if.htm']If[/URL] [URL='https://autoit-script.ru/docs/functions/stringstripws.htm']StringStripWS[/URL]($sP, 8) <> '' [URL='https://autoit-script.ru/docs/keywords/if.htm']Then[/URL] [URL='https://autoit-script.ru/docs/libfunctions/_arrayadd.htm']_ArrayAdd[/URL]($Smart, $sP)
[URL='https://autoit-script.ru/docs/keywords/if.htm']If[/URL] [URL='https://autoit-script.ru/docs/functions/stringstripws.htm']StringStripWS[/URL]($sT, 8) <> '' [URL='https://autoit-script.ru/docs/keywords/if.htm']Then[/URL] [URL='https://autoit-script.ru/docs/libfunctions/_arrayadd.htm']_ArrayAdd[/URL]($Smart, $sT)
[URL='https://autoit-script.ru/docs/keywords/if.htm']If[/URL] [URL='https://autoit-script.ru/docs/functions/stringstripws.htm']StringStripWS[/URL]($sTemp, 8) <> '' [URL='https://autoit-script.ru/docs/keywords/if.htm']Then[/URL] [URL='https://autoit-script.ru/docs/libfunctions/_arrayadd.htm']_ArrayAdd[/URL]($Smart, $sTemp)
[URL='https://autoit-script.ru/docs/keywords/if.htm']If[/URL] [URL='https://autoit-script.ru/docs/functions/stringstripws.htm']StringStripWS[/URL]($sTemp231, 8) <> '' [URL='https://autoit-script.ru/docs/keywords/if.htm']Then[/URL] [URL='https://autoit-script.ru/docs/libfunctions/_arrayadd.htm']_ArrayAdd[/URL]($Smart, $sTemp231) ; Это обычно пустое значение для проверки
[URL='https://autoit-script.ru/docs/libfunctions/_arraydisplay.htm']_ArrayDisplay[/URL]($Smart, 'Smart', [URL='https://autoit-script.ru/docs/keywords/default.htm']Default[/URL], '', [URL='https://autoit-script.ru/docs/keywords/default.htm']Default[/URL], "ID|Attribute|Type|Flag|Threshold|Value|Worst|Status")
Вариант 2
Код:
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUITab.au3>
#include <GUIListView.au3>
#include <GUIImageList.au3>
#include <String.au3>
#include <Array.au3>

Const $wbemFlagReturnImmediately = 0x10
Const $wbemFlagForwardOnly = 0x20
Global $Index[0], $Smart[0][8]
Global $sTemp, $sTemp231, $sTemp1, $i, $j, $sPark, $Item[0]
Global $strVendorSpecific[0], $strVendorSpecificA[0], $k[0]

$objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\WMI")
$colItems = $objWMIService.ExecQuery("SELECT * FROM MSStorageDriver_ATAPISmartData", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
   $iCnt = 1
       For $Item In $colItems
            $strVendorSpecific = $Item.VendorSpecific
            _ArrayDisplay($strVendorSpecific,"Спецификация")
     $iCnt +=1
Next
Local $k[25]   
$k[0]=1
   $k[1]=2
   $k[2]=3
   $k[3]=4
   $k[4]=5
   $k[5]=6
   $k[6]=7
   $k[7]=8
   $k[8]=9
   $k[9]=10
   $k[10]=11
   $k[11]=12
   $k[12]=13
   $k[13]=183
   $k[14]=184
   $k[15]=187
   $k[16]=188
   $k[17]=189
   $k[18]=190
   $k[19]=191
   $k[20]=192
   $k[21]=193
   $k[22]=194
   _ArrayDisplay($k, "проверочный массив К")
For $j = 0 To UBound($k)-1
For $i = 2 to UBound($strVendorSpecific) - 1 Step 12
Select
  Case $strVendorSpecific[$i] = $k[$j]
     $sPark = $strVendorSpecific[$i] & '|' & $strVendorSpecific[$i + 1] & '|' & $strVendorSpecific[$i + 2] & '|' & $strVendorSpecific[$i + 3] & '|' & $strVendorSpecific[$i + 4] & '|' & $strVendorSpecific[$i + 5] & '|' & $strVendorSpecific[$i + 6]
   If StringStripWS($sPark, 8) <> 0 Then _ArrayAdd($Smart, $sPark)
  Case Else
     $sPark=''
EndSelect
   Next
   Next
_ArrayDisplay($Smart, 'Smart', Default, '', Default, "ID|Attribute|Type|Flag|Threshold|Значение|Worst|Status")
В обоих вариантах массив $Smart Заплняется полностью, вроде без пропусков.
Когда пробую замменить прописанный в ручном режиме массив $k, тогда в массив $Smart попадает всего несколько значений, ато и один (зависит от компа и операционки)
Вариант 3 (заменен прописанный в ручную массив $k)
Код:
For $z = 2 to UBound($strVendorSpecific) - 1 Step 12
      _ArrayAdd($k, $z)
   Next

Причем проверка в "итоговом" варианте (показ массива $k) показывает, что все значения предварительно занесены.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вариант 3 (заменен прописанный в ручную массив $k)
Не совсем понятно это выражение.
Тут в цикле массиву $k присваиваются значения 2, 14, 26 и т.д.
Возможно нужно так:
Код:
For $z = 2 to UBound($strVendorSpecific) - 1 Step 12
      _ArrayAdd($k, $strVendorSpecific[$z])
Next
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Не совсем понятно это выражение.
Тут в цикле массиву $k присваиваются значения 2, 14, 26 и т.д.
Это подсмотренные значения массива $strVendorSpecific, как будто я его получил и проверяю значения ячеек
Но ваш вариант сработал. Пришлось только добавить проверку не на не равенство пустому значению, а на значение не равное "0" потому что добивал до полного заполнения массива нули в ячейки.
 
Последнее редактирование:
Верх