|
Проблема с заполнением двухмерного массива. | ☑ | ||
---|---|---|---|---|
0
Rajva2
17.09.15
✎
21:29
|
Заполняем массив из ХМЛ. Количество строк может быть разным, потому добавляем их по мере необходимости.
Но почему то при установлении реквизита "ДвумерныйМассив[нСтрока][нКолонка] = ЗначениеУзла;" ЗначениеУзла заносится по всему массиву в колонку нКолонка. т.е. имеем ДвумерныйМассив[0][0]="1" , а когда заносим ДвумерныйМассив[1][0]="2", то и ДвумерныйМассив[0][0] становится = "2" и так по всем реквизитам. Получаем массив, в котором все строки одинаковы и равны последней загруженной. Я что-то, где-то не догоняю. Подскажите, пожалуйста. Вот код. Процедура КнопкаВыполнитьНажатие(Кнопка) ДвумерныйМассив = Новый Массив; МассивВторогоПорядка = Новый Массив (6); Чтение = Новый ЧтениеXML; Чтение.ОткрытьФайл(файл); нСтрока = -1; Пока Чтение.Прочитать() Цикл Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда ИмяУзла = Чтение.Имя; Если ИмяУзла = "стр" тогда ДвумерныйМассив.Добавить(МассивВторогоПорядка); нСтрока = нСтрока + 1; нКолонка = -1; КонецЕсли; ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда ЗначениеУзла = Чтение.Значение; нКолонка = нКолонка + 1; ДвумерныйМассив[нСтрока][нКолонка] = ЗначениеУзла; КонецЕсли; КонецЦикла; |
|||
1
NcSteel
17.09.15
✎
21:34
|
потому что "ЗначениеУзла" является ссылочным типом и меняется значение в массиве старое значение от Чтение.Прочитать()....
Сылочные типы млять! |
|||
2
Rajva2
17.09.15
✎
21:42
|
(1) не очень силен в "Сылочные типы млять!" , тогда надо присвоение делать как то так
ДвумерныйМассив[нСтрока][нКолонка] = ЗначениеУзла.Значени; Но что-то такого нет. |
|||
3
NcSteel
17.09.15
✎
21:59
|
(2) Еще раз .... посмотри что такое "ЗначениеУзла"....
|
|||
4
NcSteel
17.09.15
✎
22:00
|
(3) А именно тип, уверен, что не строка
|
|||
5
Rajva2
17.09.15
✎
22:02
|
У меня конечно два часа ночи, но в отладчике вижу.
Тип - строка. |
|||
6
NcSteel
17.09.15
✎
22:04
|
ну значит ты не договариваешь... проверяй итерации отладкой,
|
|||
7
hhhh
17.09.15
✎
22:07
|
(5) вот же, реально бред
ДвумерныйМассив.Добавить(МассивВторогоПорядка); один и тот же массив добавляешь. |
|||
8
Rajva2
17.09.15
✎
22:10
|
(7) ну что то примерно такое я и полагал, но делал вроде все по науке.
|
|||
9
Rajva2
17.09.15
✎
22:12
|
А.П. Габец и Д.И. Гончаров (под редакцией М.Г. Радченко).
"1С:Предприятие 8.1. Простые примеры разработки" Как создать многомерный массив? Массив является линейной динамической коллекцией с произвольным типом значений. Поэтому значениями массива могут выступать другие массивы. То есть создание массива массивов и решает задачу создания многомерного массива. Это можно делать при использовании конструктора массива (листинг 2.3) или в процессе добавления очередных элементов к массиву (листинг 2.4). Листинг 2.3. Создание многомерного массива ДвумерныйМассив = Новый Массив (2, 8); Листинг 2.4. Создание многомерного массива добавлением элементов ДвумерныйМассив = Новый Массив; МассивВторогоПорядка = Новый Массив (8); ДвумерныйМассив.Добавить(МассивВторогоПорядка); ДвумерныйМассив.Добавить(МассивВторогоПорядка); |
|||
10
NcSteel
17.09.15
✎
22:16
|
(7) Вот и ответ.... "ссылочные типы!"
|
|||
11
Rajva2
17.09.15
✎
22:18
|
(10) Согласен.
И как быть? |
|||
12
Fedor-1971
18.09.15
✎
08:44
|
(11) попробуй так: ДвумерныйМассив.Добавить(Новый Массив(6));
|
|||
13
Fedor-1971
18.09.15
✎
08:47
|
не критично, но: инициализируй нКолонка =0 до цикла, и приращивай после вставки элемента.
Если будет битый файл то получишь ошибку "Индекс вне диапазона" на втором условии. |
|||
14
Rajva2
18.09.15
✎
09:21
|
(12) Огромное человеческое спасибо! Вот это помощь, не то что некоторые "Сылочные типы млять!".
(13) а как сделать "инициализируй нКолонка =0 до цикла"? у меня в одном цикле идет заполнение двумерного массива и "нКолонка = 0" будет использоваться несколько раз. Согласен, что " = -1 " не очень красивая конструкция :) |
|||
15
Fedor-1971
18.09.15
✎
09:30
|
(14) Например, так:
нКолонка = -1; нСтрока = -1; Пока Чтение.Прочитать() Цикл и дальше ничего менять не придётся. |
|||
16
Rajva2
18.09.15
✎
09:38
|
(15) Почему же не придется ничего менять?
новая строка создается по условию Если ИмяУзла = "стр" тогда ДвумерныйМассив.Добавить(МассивВторогоПорядка); нСтрока = нСтрока + 1; нКолонка = -1; добавляется новая строка нСтрока + 1 а вот нКолонка должна обнулиться. |
|||
17
Fedor-1971
18.09.15
✎
09:45
|
(16) Я имел в виду если инициализировать не нКолонка = 0, а нКолонка = -1 твой код работы с ячейками таблицы не изменится.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |