Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: Пред. 1 2
RSS
Массив массивов из переменных, Как правильно обновить значения переменных после их изменения внутри массива
 
Цитата
Михаил С. написал:
Я так и не врубился
Я походу тоже  8-0
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, это не то…
Спасибо всем за участие!

Подытожим:
Цитата
sokol92 [#5]: Эти элементы не являются ссылкой на arr0, arr1,..., как это было бы в случае с объектами, a живут собственной жизнью. Естественно, их изменение никак не может затронуть arr0,...
— это, собственно, полностью отвечает на мой вопрос "почему так". То есть просто нельзя сохранить связь при создании массива массивов. С ParamArray такая же фигня (по словам JayBhagavan).
Как сделать, чтобы связь сохранилась? Видимо, передавать массивы по-одному (без создания массива массивов), но это огромный проигрыш в скорости и здравом смысле — зачем делать отдельные, но одинаковые циклы по одному и тому же набору индексов?…
Ещё можно обойтись без функции и сделать цикл по всем переменным сразу. Быстро, логично, но неуниверсально - каждый раз с разным набором массивов не хочется нагромождать эти циклы - тело макроса нехило так "разнесёт".

Мой выбор: оставляю всё "как есть". Функция принимает массив массивов (может состоять из 1 массива) и массив индексов для фильтрации. После её работы "ручками" выполняю переприсваивание (arr0 = arrArr(0)…) каждой переменной. Быстро, универсально (приходится часто такое делать) и совсем не раздувает код.
Изменено: Jack Famous - 12 Ноя 2018 11:13:54
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
JayBhagavan написал:
задумка с ParamArray не увенчается успехом, т.к. он принимает ТОЛЬКО значения, но не ссылки на объекты. (судя из справки и по экспериментам, которые я первым делом провёл)
У меня получилось почему-то
Код
Sub test()
Dim a, b
  a = Array(1, 2, 3)
  b = Split("a b c")
  proc a, b
  Debug.Print Join(a), Join(b)
End Sub

Function proc(ParamArray x())
Dim i&
  For i = LBound(x) To UBound(x)
    x(i)(0) = 9
  Next
End Function
Результат
Код
9 2 3         9 b c
 
Доброе время суток.
Цитата
Jack Famous написал:
зачем делать отдельные, но одинаковые циклы по одному и тому же набору индексов?…
Не в читывался в обсуждение, но по этой фразе, а зачем делать массив массивов, если можно использовать массив с пользовательским типом данных?
Код
Public Type MyDataType
    ContractId As String
    Discount As Single
    IsSpecial As Boolean
    Price As Double
    ' и так далее
End Type

Public Sub test()
    Dim MyData() As MyDataType, i As Long, vSum As Double
    ReDim MyData(1 To 1000)
    vSum = 0
    For i = 1 To 1000
        'обращение к структуре
        vSum = vSum + MyData(i).Discount * MyData(i).Price
    Next
End Sub
Опять же код будет более читабельным.
 
Казанский, опачки  8-0 всё надо самому проверять… Сейчас попробую — спасибо!  :idea:
Андрей VG, как я понимаю, это и есть класс — пока не дошёл до них и чувствую себя неуверенно… Спасибо!
Если можно - покажите на моём примере :)
Изменено: Jack Famous - 12 Ноя 2018 11:52:58
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Казанский, спасибо за Ваше замечание. Признаю, был не прав, т.к. использовал "for each". По Вашему методу всё получилось:
Скрытый текст

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
Jack Famous написал:
Андрей VG , как я понимаю, это и есть класс — пока не дошёл до них и чувствую себя неуверенно… Спасибо! Если можно - покажите на моём примере
Это не класс а пользовательская функция, классы немного сложнее и намного интересней  :D
"Все гениальное просто, а все простое гениально!!!"
 
Казанский, всё верно — слегка изменённая функция прекрасно работает.  :idea: Про нюансы использования For each… для массивов массивов понял ещё при первом написании функции — тут даже счётчик не поможет (только с Redim Preserve в данном примере можно применить) и лучше сразу перейти на конкретику с For i … To … Ещё раз большое вам спасибо!
ВЕСЬ КОД

Цитата
Андрей VG: Public Type
Цитата
Nordheim: Это не класс а пользовательская функция
всегда думал, что функция — это та, что Function
Изменено: Jack Famous - 12 Ноя 2018 13:01:59
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
Jack Famous написал:
всегда думал, что функция — это та, что Function…
Алексей, коллега описался. Пользовательский тип. В Pascal запись (record), в C# - структура. Но не в этом суть. Это ближайший аналог таблицы на массивах - ничего сложного. Класс - это чуть сложнее - следующий шаг.
 
Цитата
Андрей VG написал:
Класс - это чуть сложнее - следующий шаг.
Но насколько интересно его использовать
и код написан на классах на много интересее  
 
Андрей VG, благодарю за пояснение  :) а почитать что-нибудь конкретное посоветуете или гуглом штурмовать?)) я на практических примерах хорошо понимаю, но вот у вас не понял, как массив наполнили и чем)))
Цитата
Nordheim: классы немного сложнее и намного интересней
Цитата
ivanok_v2: код, написанный на классах, намного интереснее
я собираюсь добраться и до классов  ;)
Изменено: Jack Famous - 12 Ноя 2018 12:45:25
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
Андрей VG написал:
Алексей, коллега описался. Пользовательский тип
Андрей VG, Спасибо! Конечно же не функция а пользовательский тип  ;)
Цитата
Jack Famous написал:
всегда думал, что функция — это та, что Function…
Код
Property Get Test()
End Property

вроде как фнкция, но Function даже и не упоминается.
Изменено: Nordheim - 12 Ноя 2018 12:54:23
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim: вроде как функция
получение свойства чего-то? Не знаю, как там по терминологии…
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
Jack Famous написал:
как массив наполнили и чем
Дык, наполняем точно так же как в примере читаем из него данные. А чем - так я по вашему примеру тоже не понял с чем мы имеем дело :)
 
Андрей VG, ладно - это уже другая история для другой темы))) спасибо за наводку и советы!  :)
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Offtop
Цитата
Jack Famous написал:
это уже другая история для другой темы
Не спорю, лишь бы не для подобной ;)
 
Цитата
Андрей VG: лишь бы не для  подобной
надеюсь, что не мог дать повод для того, чтобы вы так думали обо мне…  :D
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
Страницы: Пред. 1 2
Читают тему (гостей: 1)
Наверх