Что нового

[Массивы] Отчего ошибка "Array variable has incorrect number of subscripts or.."

AzazeLHAck

Новичок
Сообщения
2
Репутация
0
Привет, ребята,
Скрипт сканирует папки и статистические данные из них:
Папки такого формата:
\cat0001
\subcat0001
\subcat0002
\item0001
\item0002
В каждой папке лежит файл Data.ini, в который при каждом запуске программы, записываются данные о подпапках и данные из ini, которые в этих подпапках.

И я тут не могу понять, почему в указанной в отчёте строке может происходить такая ошибка..?

Код:
Func Total_Scan()
	$cat_array = _DirListToArray($Data)
	; Удаление старых данных о категориях
	IniDelete($Data&"\Data.ini","list")
	IniWrite($Data&"\Data.ini","main","quantity",$cat_array[0])
	Global $total = 0
	For $i=1 to $cat_array[0]
		$subcat_array = _DirListToArray($Data&"\"&$cat_array[$i])
		; Удаление старых данных о подкатегориях
		IniDelete($Data&"\"&$cat_array[$i]&"\Data.ini","list")
		IniWrite($Data&"\"&$cat_array[$i]&"\Data.ini","category","quantity",$subcat_array[0])
		IniWrite($Data&"\Data.ini","list",$cat_array[$i],IniRead($Data&"\"&$cat_array[$i]&"\Data.ini","category","name","Noname"))
		Local $cat_total = 0
		For $j=1 to $subcat_array[0]
			$item_array = _DirListToArray($Data&"\"&$cat_array[$i]&"\"&$subcat_array[$j])
			; Удаление старых данных о предметах
			IniDelete($Data&"\"&$cat_array[$i]&"\"&$subcat_array[$j]&"\Data.ini","list")
			IniWrite($Data&"\"&$cat_array[$i]&"\"&$subcat_array[$j]&"\Data.ini","Subcategory","quantity",$item_array[0])
			IniWrite($Data&"\"&$cat_array[$i]&"\Data.ini","list",$subcat_array[$j],IniRead($Data&"\"&$cat_array[$i]&"\"&$subcat_array[$j]&"\Data.ini","Subcategory","name","Noname"))
			Local $subcat_total = 0
			For $k=1 to $item_array[0]
				; Считаем ПРЕДМЕТЫ
				IniWrite($Data&"\"&$cat_array[$i]&"\"&$subcat_array[$j]&"\Data.ini","list",$item_array[$k],IniRead($Data&"\"&$cat_array[$i]&"\"&$subcat_array[$j]&"\"&$item_array[$k]&"\Data.ini","Item","type","Noname")&" "&IniRead($Data&"\"&$cat_array[$i]&"\"&$subcat_array[$j]&"\"&$item_array[$k]&"\Data.ini","Item","name","Noname"))
				$tempprice = IniRead($Data&"\"&$cat_array[$i]&"\"&$subcat_array[$j]&"\"&$item_array[$k]&"\Data.ini","Item","priceusd",0)*IniRead($Data&"\"&$cat_array[$i]&"\"&$subcat_array[$j]&"\"&$item_array[$k]&"\Data.ini","Item","quantity",0)
				$subcat_total = $subcat_total + $tempprice
			Next
			; Вписываем last
			$last_item = $item_array[$item_array[0]]
			$last_item = StringTrimLeft($last_item,4)
			For $i = 1 to 4
				$numctrl = StringMid($last_item,1,1)
				If $numctrl <> 0 Then
					ExitLoop
				EndIf
			$last_item = StringTrimLeft($last_item,1)
			If $i = 4 Then $last_item = "0"
			Next
			IniWrite($Data&"\"&$cat_array[$i]&"\"&$subcat_array[$j]&"\Data.ini","Subcategory","last",$last_item)
			; Считаем ПОДКАТЕГОРИИ
			IniWrite($Data&"\"&$cat_array[$i]&"\"&$subcat_array[$j]&"\Data.ini","Subcategory","Total",$subcat_total)
			$tempprice = IniRead($Data&"\"&$cat_array[$i]&"\"&$subcat_array[$j]&"\Data.ini","Subcategory","Total",0)
			$cat_total = $cat_total + $tempprice
		Next
		; Вписываем last
		$last_subcat = $subcat_array[$subcat_array[0]]
		$last_subcat = StringTrimLeft($last_subcat,6)
		For $i = 1 to 4
			$numctrl = StringMid($last_subcat,1,1)
			If $numctrl <> 0 Then
				ExitLoop
			EndIf
		$last_subcat = StringTrimLeft($last_subcat,1)
		If $i = 4 Then $last_subcat = "0"
		Next
		; СТРОКОЙ НИЖЕ ОШИБКА!!!
		IniWrite($Data&"\"&$cat_array[$i]&"\Data.ini","Category","last",$last_subcat)
		; Считаем КАТЕГОРИИ
		IniWrite($Data&"\"&$cat_array[$i]&"\Data.ini","category","Total",$cat_total)
		$tempprice = IniRead($Data&"\"&$cat_array[$i]&"\Data.ini","category","Total",0)
		$total = $total + $tempprice
	Next
	; Вписываем last
	$last_cat = $cat_array[$cat_array[0]]
	$last_cat = StringTrimLeft($last_cat,3)
	For $i = 1 to 4
		$numctrl = StringMid($last_cat,1,1)
		If $numctrl <> 0 Then
			ExitLoop
		EndIf
	$last_cat = StringTrimLeft($last_cat,1)
	If $i = 4 Then $last_cat = "0"
	Next
	IniWrite($Data&"\Data.ini","main","last",StringTrimLeft($last_cat,3))
	IniWrite($Data&"\Data.ini","main","Total",$total)
EndFunc


Вот отчёт:
W:\Projects\Budjet Pro\Budjet Pro 1.1\BudjetPro.au3 (1478) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
IniWrite($Data&"\"&$cat_array[$i]&"\Data.ini","Category","last",$last_subcat)
IniWrite($Data&"\"&^ ERROR

Есть какие-нибудь мысли по этому поводу..?
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Re: [Массивы] Array variable has incorrect number of subscripts or subscript dimension range..

Может из за вложеных друг в друга циклов использующих одну переменную:

Код:
For $i=1 to $cat_array[0]
   ;...
    For $i = 1 to 4
       ;...
    Next
   ;...
    For $i = 1 to 4
       ;...
    Next
   ;...
Next
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: [Массивы] Array variable has incorrect number of subscripts or subscript dimension range..

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Как правильно называть темы

"Array variable has incorrect number of subscripts or subscript dimension range.." - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, Модератор форума.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Re: [Массивы] Array variable has incorrect number of subscripts or subscript dimension range..

qsort [?]
Переменные в циклах - локальные.

Угадайте сколько.
Код:
$j = 0
For $i = 1 To 4 Step +1
	For $i = 1 To 2 Step +1
		$j += 1
		ConsoleWrite($j & ': ' & $i & @LF)
		If $j > 100000 Then Exit
	Next
Next
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: [Массивы] Array variable has incorrect number of subscripts or subscript dimension range..

qsort
циклы не имеют своего пространства переменных и используют либо глобальное, если определены в головной части, либо функции, если определены внутри нее.
 
Автор
A

AzazeLHAck

Новичок
Сообщения
2
Репутация
0
Re:

qsort сказал(а):
($i = 4) вернет True по любому.
Это почему же..? If - это ведь условие, он не присвоит $i значение 4, следовательно, если цикл проходит 4 раза, то под конец четвёртого $last_item получает 0, разве не так..?
dwerf сказал(а):
Может из за вложеных друг в друга циклов использующих одну переменную:
Абсолютно верно! :smile: Всё исправил! Всё работает! :smile: Спасибо всем! Глобальный модератор, прости за невнимательность ;)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
qsort [?]
По идее, опять же, здесь, как раз, идет присвоение, для сравнения существует оператор "==".
в AutoIt если "=" используется в условных операторах, то имеется в виду именно сравнение, а не присвоение. классический оператор сравнения "==" используется только когда нужно проверить строку на точное совпадение. правда я смутно представляю что есть та точность, может вплоть до регистра. другими словами
Код:
If $i = 4 Then $last_cat = "0"

конструкция правильная.
 
Верх