Что нового

Динамическое создание массива

  • Автор темы maximus_808
  • Дата начала
M

maximus_808

Гость
Как можно в autoit создать двумерный массив динамически?
Тоесть если заранее не извесна его размерность ...
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 573
Репутация
933
maximus_808 сказал(а):
Как можно в autoit создать двумерный массив динамически?
Тоесть если заранее не извесна его размерность ...
$i = 10
Dim $var[$i]
 
Автор
M

maximus_808

Гость
Belfigor сказал(а):
maximus_808 сказал(а):
Как можно в autoit создать двумерный массив динамически?
Тоесть если заранее не извесна его размерность ...
$i = 10
Dim $var[$i]
Спасибо за подсказку :smile:
Как раз нашел ответ на свой же вопрос ...
Только колличество элементов в массиве заранее не известно.
Для этого очень хорошо может подойти ReDim (из хелпа):
"...
Ключевое слово ReDim подобно Dim, за исключением того, что ReDim сохраняет значения массива при изменении размеров вместо их удаления. Количество размерностей должно остаться тем же, иначе после выполнения ReDim прежнее содержание массива исчезнет. Массив остается в той же области видимости (Global или Local), как и до изменения размеров.

..."

Вот решение задачи (немного кривовато - писал для себя :smile: ):
Код:
Local $row = 0
Local $col = 1
	; Если в массиве только одна запись, значит массив пустой (нет файлов в директории)
	If $DevFileListArray[0] = 1 Then
;		_ArrayDisplay($TreeFileArr)
		GuiCtrlCreateTreeViewItem("Нет файлов", $treeItemDir)
	Else
		$TreeItemFile = $TreeFileArr
		For $i = 2 To $TreeFileArr[0]

			ReDim $TreeView[$row+1][$col+1]
			$row +=1
			$TreeItemFile[$i] = GuiCtrlCreateTreeViewItem($TreeFileArr[$i], $treeItemDir)
			$TreeFileItemFromDevFileTmp = FileOpen($TreeFileArr[1] & "\" & $TreeFileArr[$i] & ".list",0)
			$CountLine = 1 ;Счетчик строк в файле описания конфигурации
			While 1
				$TreeFileItemFromDevFileTmpLine = FileReadLine($TreeFileItemFromDevFileTmp,$CountLine)
				If @error = -1 Then 
					ExitLoop
				EndIf
			
				$TreeFileItemFromDevFileTmpLineArray = StringSplit(StringStripWS($TreeFileItemFromDevFileTmpLine,8), "|",0)
				
				If $col < $TreeFileItemFromDevFileTmpLineArray[0] Then $col = $TreeFileItemFromDevFileTmpLineArray[0]
				ReDim $TreeView[$row+1][$col+1]
		
				For $x = 1 To $TreeFileItemFromDevFileTmpLineArray[0]

					$TreeView[$row][$x] = $TreeFileItemFromDevFileTmpLineArray[$x]
				Next
				If $CountLine > 1 Then GuiCtrlCreateTreeViewItem($TreeFileItemFromDevFileTmpLineArray[1] & " (" & $TreeFileItemFromDevFileTmpLineArray[0] & " элементов)", $TreeItemFile[$i])
				

				$CountLine +=1
				$TreeView[$row][0] = $TreeFileArr[$i]
				$row +=1
			WEnd
			FileClose($TreeFileItemFromDevFileTmp)

		Next
	EndIf
 

SyDr

Сидра
Сообщения
651
Репутация
158
1) :smile: Код не работает, поскольку не приведён полностью.
2) Слишком часто ReDim используешь. Весьма ресурсоёмкая операция. Попробуй сократить число вызовов. Один из вариантов:
Кончается место в массиве - удваиваешь размер.
Завершил добавление элементов в массив - урезаешь до нужной величины.
 
Автор
G

GenoTIP

Гость
SyDr сказал(а):
Завершил добавление элементов в массив - урезаешь до нужной величины.
урезать через
Код:
_ArrayDelete
или как-то выгоднее можно сделать это?
 

running-frag

why me?
Сообщения
441
Репутация
60
http://autoit-script.ru/index.php/topic,8032.msg54548.html#msg54548
Может поможет.

Т.е. если прикинуть обьявляем (отбалды)

Код:
$variables[10]; если одномерный
$variables[10][10] ; если двумерный

А после уже с ними работаем, добавляя или убирая элементы.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
OffTopic:
Belfigor
Ну-у-у, вы же вроде завсегдатай!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
GenoTIP [?]
или как-то выгоднее можно сделать это
Я примерно так делаю.
Код:
#include <Array.au3>

Dim $aArray[1], $iCount

$iEnd = Random(200, 300, 1)
ConsoleWrite($iEnd & @LF)
$iUb = Int($iEnd / 5);только для примера
ReDim $aArray[$iUb + 1]
$aArray[0] = $iUb
_ArrayDisplay($aArray)
For $i = 1 To $iEnd
	If Random(0, 1, 1) Then
		$iCount += 1
		If $iCount = $aArray[0] Then
			$aArray[0] *= 2
			ReDim $aArray[$aArray[0] + 1]
			ConsoleWrite('ReDim' & @LF)
		EndIf
		$aArray[$iCount] = $i
	EndIf
Next
ReDim $aArray[$iCount + 1]
$aArray[0] = $iCount
_ArrayDisplay($aArray)
 
Верх