Что нового

Как автоматически раздвигать массив?

Suppir

Продвинутый
Сообщения
967
Репутация
62
Код:
$aini = StringSplit(Fileread("компаратор.ini"), @CRLF, 1)
Global $asin[1][2]


For $x = 1 to $aini[0]
	$aini[$x] = StringReplace($aini[$x], "=", "|")
	Local $Matches = StringRegExp($aini[$x], "(.+?)\|", 1)
	if @error = 0 Then
		$asin[$x][0] = $aini[$x]
		$asin[$x][1] = $Matches[0]
	EndIf
Next


Как сделать, чтобы размеры массива $asin автоматически раздвигались при включении новых элементов?

Если сразу задать $asin[1000][2], то в массиве будет куча пустых элементов (ведет к проблемам при его переборе).
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 589
Репутация
936
Код:
ReDim
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
еще бы понять, как им пользоваться...
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 589
Репутация
936
Dim $x[10] - теперь у тебя в массиве 10 ячеек

RedDim $x[15] - Теперь у тебя в массиве 15 ячеек


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

Правда я не знаю что становится с данными массива при его редиминге, в частности при расширении массива сохранятся ли уже имеющиеся в нем данные и просто добавятся пустые ячейки или же все данные массива обнулятся.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Belfigor [?]
Правда я не знаю что становится с данными массива при его редиминге
если новый размер по какому либо индексу меньше старого, то обнуляется. если все новые размеры больше старых то сохраняется
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Код:
Кажется, так работает:

$aini = StringSplit(Fileread("компаратор.ini"), @CRLF, 1)
Global $asin[1][2]


For $x = 1 to $aini[0]
    $aini[$x] = StringReplace($aini[$x], "=", "|")
    Local $Matches = StringRegExp($aini[$x], "(.+?)\|", 1)
    if @error = 0 Then
        ReDim $asin[$x+1][2]
        $asin[$x][0] = $aini[$x]
        $asin[$x][1] = $Matches[0]
    EndIf
Next
 

XM

Знающий
Сообщения
70
Репутация
8
....размеры больше старых то сохраняется.....
Из справки: ReDim сохраняет значения массива при изменении размеров вместо их удаления. Количество размерностей должно остаться тем же, иначе после выполнения ReDim прежнее содержание массива исчезнет.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
vendor
да. я ошибочно думал, что если делать ReDim в меньшую сторону то пойдет обнуление. спасибо за исправление
 

XM

Знающий
Сообщения
70
Репутация
8
Kaster, спс за +1!
А вообще, если массив одномерный, то удобнее пользоваться библиотечной функцией _ArrayAdd():
Код:
#include <array.au3>

;объявляем одномерный массив с 1-им элементом
Dim $aData[1] = ['data_1']
;Затем появляется еще один элемент (data_2), который нужно добавить в массив:
_ArrayAdd($aData, 'data_2')
_ArrayDisplay($aData)
;Как видно, массив самостоятельно увеличил свою размерность.


С 2D массивами немного сложнее, тут приходиться прибегать к другим методам.
 
Верх