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

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

Мой выбор: оставляю всё "как есть". Функция принимает массив массивов (может состоять из 1 массива) и массив индексов для фильтрации. После её работы "ручками" выполняю переприсваивание (arr0 = arrArr(0)…) каждой переменной. Быстро, универсально (приходится часто такое делать) и совсем не раздувает код.
Изменено: Jack Famous - 12.11.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.11.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.11.2018 13:01:59
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
всегда думал, что функция — это та, что Function…
Алексей, коллега описался. Пользовательский тип. В Pascal запись (record), в C# - структура. Но не в этом суть. Это ближайший аналог таблицы на массивах - ничего сложного. Класс - это чуть сложнее - следующий шаг.
 
Цитата
Андрей VG написал:
Класс - это чуть сложнее - следующий шаг.
Но насколько интересно его использовать
и код написан на классах на много интересее  
 
Андрей VG, благодарю за пояснение  :) а почитать что-нибудь конкретное посоветуете или гуглом штурмовать?)) я на практических примерах хорошо понимаю, но вот у вас не понял, как массив наполнили и чем)))
Цитата
Nordheim: классы немного сложнее и намного интересней
Цитата
ivanok_v2: код, написанный на классах, намного интереснее
я собираюсь добраться и до классов  ;)
Изменено: Jack Famous - 12.11.2018 12:45:25
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Андрей VG написал:
Алексей, коллега описался. Пользовательский тип
Андрей VG, Спасибо! Конечно же не функция а пользовательский тип  ;)
Цитата
Jack Famous написал:
всегда думал, что функция — это та, что Function…
Код
Property Get Test()
End Property

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