Что нового

О последовательном наполнении двумерных массивов

Suppir

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

Можно ли что-то придумать кроме следующего ужасного кода?

Код:
Global $garLearn[1][3]

;далее идут операции в цикле
ReDim $garLearn[Ubound($garLearn, 1) + 1][3]
$garLearn[Ubound($garLearn, 1) - 1][0] = $mat[0]
$garLearn[Ubound($garLearn, 1) - 1][1] = $attr
$garLearn[Ubound($garLearn, 1) - 1][2] = $mat[2]
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
ReDim довольно медленная штука, лучше заранее определить массив, скажем в 100, а затем, как он заполниться, расширить его еще на 100 и т.д. Количество действительных записей в массиве лучше всего хранить в нулевом элементе - [0][0].
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Т.е. сначала вы растягиваем массив с помощью функции ReDim. При этом в качестве нового размера указываем "старый размер + 1".

Потом необходимо дописать в конец раздвинутого массива необходимы значения. Для этого опять пользуемся Ubound.


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

Yashied

я поставил значение с запасом 10000. Оказалось, что этого мало. Когда поставил 50000 - все равно вылетело однажды. Если поставлю миллион, то при этом тормоза возникают на этапе чистки массива (необходимо удалять незаполненные элементы в конце).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
IMHO это самый оптимальный способ.

Код:
Dim $Data[1001][3] = [[0]]

For $i = 1 To 6440
	$Data[0][0] += 1
	If $Data[0][0] > UBound($Data) - 1 Then
		ReDim $Data[$Data[0][0] + 1000][3]
	EndIf
	$Data[$Data[0][0]][0] = ...
	$Data[$Data[0][0]][1] = ...
	$Data[$Data[0][0]][2] = ...
Next

ReDim $Data[$Data[0][0] + 1][3]
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Спасибо, попробую этот вариант.
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Suppir
Проблема в том, что невозможно заранее узнать количество элементов?
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
snoitaleR
Да, невозможно. Пользователь копирует в программу названия документов. Этих документов может быть любое количество - 1000, 10000 а вообще их более 4 млн. Названия парсятся регулярными выражениями и разбиваются на "тип", "номер, дата", "название" - все это хранится в двумерном массиве, который потом активно используется и преобразовывается (сравнивается с другими массивами: двумерными и простыми). Поэтому в массиве не должно быть пустых элементов (ни в середине, ни в конце).
Можно, конечно сразу создать массив в 10 млн. документов, но тогда нужно ему будет отрезать "хвост" из пустых элементов.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Suppir [?]
Названия парсятся регулярными выражениями и разбиваются на "тип", "номер, дата", "название" - все это хранится в двумерном массиве, который потом активно используется
создать массив в 10 млн. документов
В таком случае, думаю лучше использовать уже не массивы, а БД!
 

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
Suppir
А если использовать такую конструкцию в циклах?
Код:
Assign('s' & $i &'_'& $d, 'текст')
Eval('s' & $i &'_'& $d)


Я их использовал, так как синтаксис массива досконально не разобрал, и всегда встречал проблему, вместо создания скрипта изучал свойства массива и возможности им манипулировать. Переменная имеет как бы индекс в данном случае двойной, и переменной также можно манипулировать как массивом данных, с единственным отличием, размерность такого "массива" изменять в цикле типа $size+=1 при добавлении нового элемента, в общем то эта размерность нужна только для указания в цикле. Как себя будет вести миллион переменных незнаю.
 
Автор
S

Suppir

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