Что нового

Ошибка, массив (Array variable subscript badly formatted)

forbrock

Новичок
Сообщения
43
Репутация
0
Всем привет.
Не могу понять в чем ошибка.
Скрипту нужно из заданного каталога сравнить имена файлов из массива и отсортировать скопировав по каталогам 210 и 420.
Проверяю и...
Ошибка: Array variable subscript badly formatted
Код:
MsgBox(0,'',$pFrom & '\65' & $c & '\tip1\' & $sp & '\210\' & $ar210[$keyIndex] & '.' & $c, $pWhere)
MsgBox(0,'',$pFrom & '\65' & $c & '\tip1\' & $sp & '\210\' & $ar210[^ ERROR

Код:
#include <Array.au3>
#include <File.au3>

Opt('TrayIconDebug',1)
Dim $array[23] = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]
Dim $ar210[12] = ['base','ist1','ist2','it_11','pasp','s01_1','som','sop','it_21','itog2','kz','z']
Dim $ar420[27] = ['data','dv','int','itog','korc','korn','kors','kort','nov','rv','st14','st26','v_po','vn','data2','int2','korc2','korn2','kors2','kort2','opis','s01_2','sn','sp_sum','sp_sum01','spr','vn2']
Dim $arrSP[2] = ['sp1','sp2']

$pFrom = 'o:\2014-03\per1' ; Откуда будут копироваться файлы периода
$pWhere = 'd:\temp\per\' ; Куда будут копироваться файлы периода

For $v In $array
;~ Блок создания переменной для номера района (отнимает 1 и/или добавляет '0' к началу цифры, если $v <= 10)
   If $v < '10' Then 
	  $c = '0' & $v
    Else
	  $c = $v
   EndIf
   For $sp In $arrSP
	  If FileExists($pFrom & '\65' & $c & '\tip1\' & $sp) Then 
		 Switch $sp
			Case 'sp1'
			   $fList = _FileListToArray($pFrom & '\65' & $c & '\tip1\' & $sp, '*', 0)
                	   _ArraySort($ar210)
			   For $i = 1 To $fList[0]
				  $keyIndex = _ArrayBinarySearch($ar210, StringTrimRight($fList[$i],3))
;~				  If Not @error Then MsgBox(4096,'Ф 210', 'Район ' & $c & ', ' & $sp & @CRLF & 'Элемент: ' & $ar210[$keyIndex])
;~ 				  If Not @error Then FileCopy($pFrom & '\65' & $c & '\tip1\' & $sp & '\210\' & $ar210[$keyIndex] & '.' & $c, $pWhere, 8)
				  MsgBox(0,'',$pFrom & '\65' & $c & '\tip1\' & $sp & '\210\' & $ar210[$keyIndex] & '.' & $c, $pWhere)
			   Next
			   _ArraySort($ar420)
			   For $i = 1 To $fList[0]
				  $keyIndex = _ArrayBinarySearch($ar420, StringTrimRight($fList[$i],3))
;~				  If Not @error Then MsgBox(4096,'Ф 420', 'Район ' & $c & ', ' & $sp & @CRLF & 'Элемент: ' & $ar420[$keyIndex])
;~ 				  If Not @error Then FileCopy($pFrom & '\65' & $c & '\tip1\' & $sp & '\420\' & $ar420[$keyIndex] & '.' & $c, $pWhere, 8)
			   Next
			Case 'sp2'
			   $fList = _FileListToArray($pFrom & '\65' & $c & '\tip1\' & $sp, '*', 0)
			   _ArraySort($ar210)
			   For $i = 1 To $fList[0]
				  $keyIndex = _ArrayBinarySearch($ar210, StringTrimRight($fList[$i],3))
;~				  If Not @error Then MsgBox(4096,'Ф 210', 'Район ' & $c & ', ' & $sp & @CRLF & 'Элемент: ' & $ar210[$keyIndex])
;~ 				  If Not @error Then FileCopy($pFrom & '\65' & $c & '\tip1\' & $sp & '\210\' & $ar210[$keyIndex] & '.' & $c, $pWhere, 8)
			   Next
			   _ArraySort($ar420)
			   For $i = 1 To $fList[0]
				  $keyIndex = _ArrayBinarySearch($ar420, StringTrimRight($fList[$i],3))
;~				  If Not @error Then MsgBox(4096,'Ф 420', 'Район ' & $c & ', ' & $sp & @CRLF & 'Элемент: ' & $ar420[$keyIndex])
;~ 				  If Not @error Then FileCopy($pFrom & '\65' & $c & '\tip1\' & $sp & '\420\' & $ar420[$keyIndex] & '.' & $c, $pWhere, 8)
			   Next
		 EndSwitch
	  EndIf
   Next
Next
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
плохо читали справку
http://autoit-script.ru/autoit3_docs/libfunctions/_arraybinarysearch.htm
 
Автор
F

forbrock

Новичок
Сообщения
43
Репутация
0
C2H5OH [?]
плохо читали справку

Да как раз перед глазами справка, вроде все верно. Массив отсортирован.
Как говорят - "В упор не вижу" :(



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

Ага, ошибка 3 - Значение не найдено в массиве.
На второй итерации почему то возвращается ошибка -1, значение которой принимает $keyIndex
Пока не знаю что с этим делать.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
То есть Ваш алгоритм рассчитан на то что искомое значение ВСЕГДА присутствует в массиве?
Вот и наступаете на грабли.
Ну, думайте что делать в такой ситуации. :scratch:
Поставьте, например
Код:
_ArrayDisplay

после того как сформирован массив и посмотрите на него...
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Код:
$fList = _FileListToArray($pFrom & '\65' & $c & '\tip1\' & $sp, '*', 0)

Здесь мы получаем список файлов и ПАПОК, которые нашлись в каталоге.

Буквально через пару строк:
Код:
$keyIndex = _ArrayBinarySearch($ar210, StringTrimRight($fList[$i],3))

Получаем индекс найденного значения. Причем в значение мы подставляем... Эмм... "отрезать справо 3 символа".

Вопрос 1 - допустим в переменную $fList попала папка из 2 символов - мы обрезали все символы (т.к. 3 больше 2) - получилась "пустота".
Вопрос 2 - почему именно 3 символа ? Если расширение файлов, то как быть с файлами jpeg - здесь 4 символа. Так же интересный момент: отрезаем 3 символа, но оставляем ТОЧКУ после имени файла !!!

Сложно судить какие у тебя данные в массиве $fList - по-этому могу только предполагать, что имена файлов в массиве $fList у тебя с расширениями, т.е. обрезаешь ты дальше "точки", но не саму точку, а ищешь ты в массиве $ar210 - если присмотреться, то там нет точек.

Код:
Dim $ar210[12] = ['base','ist1','ist2','it_11','pasp','s01_1','som','sop','it_21','itog2','kz','z']

Это у нас статический массив и на протяжении всего скрипта он не меняется ?
Код:
_ArraySort($ar210)

Если так - то не обязательно каждый раз его отсортировывать в циклах - достаточно одного раза)))))

После
Код:
$keyIndex = _ArrayBinarySearch...........

Лучше все же поставить
Код:
If Not @error Then

Которые у тебя стоят под комментом, т.к. сам понимаешь:
Значение не найдено в массиве.
 
Автор
F

forbrock

Новичок
Сообщения
43
Репутация
0
Спасибо ребят, что не оставили в беде и попытались разобраться :smile:
Но тут я как оказалось напутал с путями и не видел ошибки (не хватало банального слэша).

to ---Zak---
Все расширения файлов состоят из двух символов, отрезаю 3 - вместе с точкой, чтобы сравнить с массивом, изменить элементы массива не проще, т.к. расширения меняются на каждой итерации от 01 до 23.
Объявленные массивы статичные, а "If Not @error Then" конечно добавил.
Код:
If Not @error Then FileCopy($pFrom & '\65' & $c & '\tip1\' & $sp & '\' & $ar210[$keyIndex] & '.' & $c, $pWhere & '\65' & $c & '\tip1\' & $sp & '\210\', 8)

Еще раз всем спасибо.

P.S. Оказывается тут существует временное ограничение для кнопки благодарности)
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
forbrock

Я всего лишь предположил с расширением в 3 символа, т.к. телепатическими способностями не обладаю)))) Удачи...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
forbrock [?]
Все расширения файлов состоят из двух символов, отрезаю 3 - вместе с точкой
Три, ИМХО, более корректных способа удалить расширение с точкой.
Код:
#include <WinAPIEx.au3>

$sPath = @ScriptFullPath
;~ 1
ConsoleWrite(StringLeft($sPath, StringInStr($sPath, '.', 0, -1) - 1) & @LF)
;~ 2
ConsoleWrite(StringRegExpReplace($sPath, '\.[^\.]*$', '') & @LF)
;~ 3
ConsoleWrite(_WinAPI_PathRemoveExtension($sPath) & @LF)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
madmasles [?]
такое расширение
Об этом я и говорю. Система не считает это расширением.
А регулярное выражение "съедает" сдвоенные расширения.
Получается, что правильное, а значит и корректное, определение - у системной функции.
 
Верх