Динамический массив

Тема в разделе "Lotus - Программирование", создана пользователем DEN888, 18 фев 2009.

  1. DEN888

    DEN888 Гость

    Репутация:
    0
    Подскажите, пожалуйста.

    Есть массив:
    (LotusScript)
    [codebox]
    ReDim MyArr(2, 2)
    MyArr(1, 1) = 1
    MyArr(2, 1) = 2
    MyArr(1, 2) = 3
    MyArr(2, 2) = 4
    'Добавляем элемент (столбец)
    ReDim Precerve MyArr(2, 3)
    MyArr(1, 3) = 5
    MyArr(2, 3) = 6
    [/codebox]

    Как добавить строку?

    На такой вариант выдает ошибку "Subscript out of range"
    [codebox]
    ReDim Precerve MyArr(3, 2)
    MyArr(3, 1) = 5
    MyArr(3, 2) = 6
    [/codebox]
     
  2. DEN888

    DEN888 Гость

    Репутация:
    0
    Разобрался.
    [codebox]Redim MyArr(1, 0)
    Redim Preserve MyArr(1, 1)
    MyArr(0, 1) = 1
    MyArr(1, 1) = 2
    Redim Preserve MyArr(1, 2)
    MyArr(0, 2) = 3
    MyArr(1, 2) = 4
    [/codebox]
     
  3. Medevic

    Medevic Что это ? :)
    Lotus team

    Репутация:
    0
    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Я всегда четко границы указываю: Dim MyArr(1 To 2, 1 To 3).
    На всякий случай(потому что есть такая штука как Option Base). -_-
     
  4. DEN888

    DEN888 Гость

    Репутация:
    0
    Спасибо за подсказку.

    Недавно начал изучать массивы в Lotus.
    Второй день бьюсь, не могу понять суть работы. :)

    Задача заключается в передаче данных в массив, (число столбцов постоянные,
    а количество строк меняется, как динамически менять массив?)
    а с массива в Excel.

    Set Range = AppExl.("A1:B4")
    Range.Value = MyArr

    Данные, например:

    Code Nm
    444 test1
    333 test2
    777 test3
    888 test4


    Можно, не большой пример, как работать с массивом
     
  5. Akupaka

    Akupaka А че я?.. О.о

    Репутация:
    0
    Регистрация:
    4 окт 2007
    Сообщения:
    3.363
    Симпатии:
    2
    открой хелп, ищи "dynamic arrays", там не много функций для работы с массивами, примеры есть, будут вопросы задавай более конкретно...

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

    еще один совет, если заранее известны размеры массива, т.е. не во время компиляции, а именно во время выполнения, т.е. массив изначально динамический, то лучше выполнить операцию Redim единожды, задав эти размеры, а не в цикле увеличивать на 1 "размер", т.к. это корректнее в отношении использования памяти... но это не критично...

    по поводу твоей задачи, не ясно откуда данные передаются, и нужен ли массив в этом случае вообще :) может можно просто циклом пройтись по ячейкам... еще не уверен, что "Range.Value = MyArr" сработает, не пробовал ранее...
     
  6. DEN888

    DEN888 Гость

    Репутация:
    0
    Согласен, хелп там хороший, уже смотрел...

    можно просто циклом пройтись по ячейкам, но такой метод замедляет работу, если полей много
    ...данные передаются из представления, где отрабатывает условие и записываются в массив
    в этом примере, массив меняется в столбце,

    делаю на оборот

    MyArr(3,1)
    MyArr(3,2)

    говорит Subscript out of range

    [codebox]Sub Click(Source As Button)
    Dim ExlApp, Range As Variant

    Set ExlApp = CreateObject("Excel.Application")
    ExlApp.Visible = False
    ExlApp.Workbooks.Add

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Взято из хелпа
    Redim MyArr(2, 2)
    MyArr(1,1) = 1
    MyArr(2,1) = 2
    MyArr(1,2) = 3
    MyArr(2,2) = 4

    Redim Preserve MyArr(2,3)
    MyArr(1,3) = 5
    MyArr(2,3)=6
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''

    Set Range = ExlApp.Range("A1:D10")
    Range.Value = MyArr
    ExlApp.Visible = True
    End Sub[/codebox]
     
  7. NickProstoNick

    NickProstoNick Статус как статус :)
    Lotus team

    Репутация:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    1.780
    Симпатии:
    39
    я как-то пробовал извращиться с переменной Variant (Не МАССИВ!!!)
    пользовал функции Split, Join и в конце FullTrim . Собирал строку с разделителем... а потом разбивал на массив
    Это достаточно удобно для одномерных массивов... но думаю можно применить и к n-мерным... главное чтоб строка влезла и не спутать порядок элементов... отсутствие определенного элемента придется заменять пустой строкой или 0 в зависимости от типа :)

    в твоем случае можно получить строку 444#test1#333#test2#777#test3#888#test4#
    и работать с ней во вложеных циклах
     
  8. Akupaka

    Akupaka А че я?.. О.о

    Репутация:
    0
    Регистрация:
    4 окт 2007
    Сообщения:
    3.363
    Симпатии:
    2
    ну вот не слушаешь, что тебе говорят :)

    сделай так:
    Код (Text):
    dim a as variant
    dim b as variant

    redim a (0 to 1)
    for i = lbound(a) to ubound(a)
    redim b (0 to 1)
    b(0) = "a" & cstr(i) & "b0"
    b(1) = "a" & cstr(i) & "b1"
    a(i) = b
    next i
    на выходе получишь массив
    a0b0 a0b1
    a1b0 a1b1
     
  9. Medevic

    Medevic Что это ? :)
    Lotus team

    Репутация:
    0
    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Если не ошибаюсь, то эксель такую конструкцию не примет.

    DEN888
    Можешь код показать?
     
  10. NickProstoNick

    NickProstoNick Статус как статус :)
    Lotus team

    Репутация:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    1.780
    Симпатии:
    39
    Код (Text):
    Range.Value = MyArr
    Я так понимаю ты хочешь передать значения всего массива в одну ячейку? Если не ошибаюсь Ехель понимает только простые типы данных
    Потому String или Variant тебе в помощь... иначе строку не склеишь
     
  11. DEN888

    DEN888 Гость

    Репутация:
    0
    [codebox]Sub Click(Source As Button)
    Dim ExlApp, Range As Variant

    Set ExlApp = CreateObject("Excel.Application")
    ExlApp.Visible = False
    ExlApp.Workbooks.Add

    Redim MyArr(2, 2)

    MyArr(1,1) = 1
    MyArr(2,1) = 2

    MyArr(1,2) = 3
    MyArr(2,2) = 4
    'добавляет столбец, а мне нужно строку
    'Redim Preserve MyArr(3,2) не работает
    Redim Preserve MyArr(2,3)
    MyArr(1,3) = 5
    MyArr(2,3)=6

    'ExlApp.Range("A1:D10") примерный диапазон для примера
    '10 заменится на переменную, которая будет суммироваться в цикле
    Set Range = ExlApp.Range("A1:D10")
    Range.Value = MyArr
    ExlApp.Visible = True
    End Sub[/codebox]

    нет, я хочу передать массив в диапазон ExlApp.Range("A1:D10"), да Variant, то что надо так, содержатся числовые, текстовые, дата данные
     
  12. NickProstoNick

    NickProstoNick Статус как статус :)
    Lotus team

    Репутация:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    1.780
    Симпатии:
    39
    https://sec.deutsche-rentenversicherung.de/...4c?OpenDocument
    получается что нельзя акпкопределять массив если он уже был определен ранее... не важно как... в момент декларирования или первого переопределения.
    Остается только выполнить Erase перед новым переопределение. Правда тогда потеряешь данные какие в ней были
     
  13. Medevic

    Medevic Что это ? :)
    Lotus team

    Репутация:
    0
    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Всё понятно.Оказывается, это фича такая:
     
  14. Akupaka

    Akupaka А че я?.. О.о

    Репутация:
    0
    Регистрация:
    4 окт 2007
    Сообщения:
    3.363
    Симпатии:
    2
    это специфика решения проблем - если багу править влом, то ее нужно задокументировать и назвать фичей :rolleyes:
     
  15. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    30 май 2006
    Сообщения:
    1.319
    Симпатии:
    4
    "Баг, переживший три фикса - считать фичей"(с)
     
  16. K-Fire

    K-Fire Гость

    Репутация:
    0
    Разобраться как работают массивы в лотусе это полезная трата времени.
    Но у меня впечатление что задача решается не совсем в нужном направлении.

    Насколько я понимаю использование массива вам нужно только для увеличения производительности? ИМХО никакой разницы не будет, все равно ячейки будут заполнены в цикле, только цикл будет либо в лотусе, либо внутри функции екселя.

    Вопрос: ексель на экране отображается в момент заполнения данных или нет?
     
  17. NickProstoNick

    NickProstoNick Статус как статус :)
    Lotus team

    Репутация:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    1.780
    Симпатии:
    39
    думаю что не отображается... ну я бы по крайней мере так и делал.

    А по производительности - считаю что ход верен... зачем весить Лотус если задачу можно перекинуть на другое вспомогательное приложение?

    И вообще... нам-то собственно чего... автор темы вообще молчит :(
     
  18. Medevic

    Medevic Что это ? :)
    Lotus team

    Репутация:
    0
    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    K-Fire
    Разница будет и весьма существенная. Наверное, эксель после каждого изменения ячеек делает перерасчет формул и т.п. Поэтому выгоднее изменить сразу несколько ячеек. Чем больше, тем лучше.
    Я думаю, нужно сделать массив массивов(как написал Akupaka). В эксель выводить построчно.
     
  19. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Репутация:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    634
    Симпатии:
    6
    в случаях, когда типы данных позволяют, то я использую их строковые представления в таких конструкция
    Код (Text):
    dim tmp variant
    const DELIM ="~*~"

    'как пример цикл чего-нибудь из чего берем единичное значение
    forall s in somthing
    tmp = tmp & DELIM & cstr(s)
    endforall
    tmp = strright(tmp,DELIM)
    tmp = split(tmp,DELIM)
    по-моему это достаточно эффективно
     
  20. DEN888

    DEN888 Гость

    Репутация:
    0
    Да, массив служит для увеличения производительности.

    Excel соответственно скрываю (указал в коде примера :( ).
    Разница будет.
    Сравните сами.
    Варианты:
    1) Заполнять массив в цикле. Вывод массива в диапазон.
    2) Или заполнять ячейки в цикле.

    в данный момент у меня реализованно следующим образом, (в принципе работает быстро)

    в цикле узнаю количество для массива, затем в втором цикле заполняю массив.

    Результат (~5000 записей, 7 столбцов)
    1 вариант 2 сек.
    2 вариант ~ 1 минута
    разница заметна ;)


    ;) почему молчит?
     
Загрузка...
Похожие Темы - Динамический массив
  1. WingmanIX
    Ответов:
    2
    Просмотров:
    1.527
  2. Marazm
    Ответов:
    0
    Просмотров:
    1.350
  3. Ruslan737
    Ответов:
    0
    Просмотров:
    1.144
  4. Ruslan737
    Ответов:
    0
    Просмотров:
    924
  5. Ruslan737
    Ответов:
    0
    Просмотров:
    931

Поделиться этой страницей