Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
Имеется некий класс cData , задача которого подготовка данных для обработки и хранения результирующих данных для последующей обработки. Все делается в Ексел VBA. Вот класс CData (модуль класса) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Дальше не легче. В программе объявляется массив - Код: plaintext Код: plaintext Вопрос такой, как из класса получить ссылку на его массив? "Есть многое на свете, друг Горацио, что и не сразу в голову придет." М. Твен "Приключения Геккельбери Финна" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2009, 22:09 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
YUBA, технически можно получить ссылку, но идеологически присутствует кричащее противоречие: массив-член класса по каким-то неведомым причинам нельзя объявлять Public, но тут же требуется именно полный доступ извне экземпляра класса. Более-менее красивым выходом здесь видится введение в класс методов-оболочек процедур работы с массивами, т. е. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2009, 13:18 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
БенедиктYUBA, технически можно получить ссылку, но идеологически присутствует кричащее противоречие: массив-член класса по каким-то неведомым причинам нельзя объявлять Public, но тут же требуется именно полный доступ извне экземпляра класса. Бенедикт , это не я придумал.Неведомые причины - это Microsoft, который не разрешает объявлять массивы и usertypы Public. В VB не помню, а в VBA это так. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2009, 14:57 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
да что вы говорите. пишите свой класс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2009, 15:05 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
Konst_Oneда что вы говорите. пишите свой класс Если сомневаетесь, в модуле класса, скажем Ексел, напишите - Public Arr() as ..... И посмотрите, что получится. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2009, 15:43 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
Constants, fixed-length strings, arrays, user-defined types, and Declare statements not allowed as Public members of an object module Not all variables in an object module can be declared as Public. However, procedures are Public by default, and Property procedures can be used to simulate variables syntactically. This error has the following causes and solutions: You declared a Public constant in an object module. Although you can't declare a Public constant in an object module, you can create a Property Get procedure with the same name. If you don't create a Property Let or Property Set procedure with that name, you are in effect creating a read-only property that can be used the same way you would use a constant. You declared a Public fixed-length string in an object module. You can simulate fixed-length strings with a set of Property procedures that either truncate the string data when it exceeds the permitted length, or notify the user that the length has been exceeded. You declared a Public array in an object module. Although a procedure can't return an array, it can return a Variant that contains an array. To simulate a Public array in a class module, use a set of Property procedures that accept and return a Variant containing an array. You placed a Declare statement in an object module. Declare statements are implicitly public. Precede the Declare statement with the Private keyword. For additional information, select the item in question and press F1 (in Windows) or HELP (on the Macintosh). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2009, 15:49 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
БенедиктYUBA, Более-менее красивым выходом здесь видится введение в класс методов-оболочек процедур работы с массивами, т. е. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Нашел вот VarPtr(Arr()) , но пока есть сомнения, особенно в части ReDim. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2009, 16:02 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
так всё-таки, почему вы не хотите заменить свои udt-структуры на классы и использовать коллекции вместо массивов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2009, 16:08 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
Konst_One, Симуляция массива передает копию, а не сам массив, а обратно будет опять таки копировать целиком. Это мне не надо, что уже написал в первом посте. Если учесть, что массивов там где-то на 250-300 МБ, то только копий не хватает для полного счастья. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2009, 16:13 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
что-то странное вы задумали на 300Гб в экселе обрабатывать. может стоит трудоёмкие операции вынести в dll , написанную на нормальном языке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2009, 16:14 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
PS Мб , очепятался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2009, 16:15 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
YUBA Бенедикт , это не я придумал.Неведомые причины - это Microsoft, который не разрешает объявлять массивы и usertypы Public. В VB не помню, а в VBA это так. :(Тьфу, едрён батон... :( Помнил про ограничения на константы, UDT и Declare, но почему-то считал, что ограничение не действует на массивы базовых типов. Надо подумать, почему так сделано. Справка предлагает HelpAlthough a procedure can't return an array, it can return a Variant that contains an array. To simulate a Public array in a class module, use a set of Property procedures that accept and return a Variant containing an array., но это тоже создание копии массива. Покажу, какую техническую возможность я имел ввиду. Класс CData: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2009, 16:22 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
Бенедикт, Спасибо, попробую вечером. Еще вопрос, а как определить размер ссылки на Usertype для sub CopyMemArrAny a, 0&, 4 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2009, 17:47 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
YUBA, размер ссылки не зависит от размера элемента. Немного почистил код. Класс: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2009, 18:20 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
Konst_Oneчто-то странное вы задумали на 300Гб в экселе обрабатывать. может стоит трудоёмкие операции вынести в dll , написанную на нормальном языке? Проект не имеет окончания и будет изменяться пока в нем, проекте и рассчетах, есть необходимость. Т.е функциональность постоянно меняется. Потому и Ексел. И что-то выносить в ДЛЛ просто нет смысла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2009, 22:35 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
Бенедикт, В коде разобрался, спасибо большое. Но что-то конкретное делать пока не начал. Который год с kernel32 собираюсь разобраться. :( x(i) = 100& + i Вот не знал, что так преобразование типов можно делать, я бы CLng так и писал. :) В хелпе этого не нашел, но принцип и так понятен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2009, 23:34 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
БенедиктYUBA, технически можно получить ссылку,..... Более-менее красивым выходом здесь видится введение в класс методов-оболочек процедур работы с массивами, т. е. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Казалось-бы. :) Но не тут-то было. Это решение не работает - не идет массив по ссылке даже так. Идет только вот так. Объявляем некий Class2 и в него пишем процедуру Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. В общем, пришлось многие функции по импорту данных в массивы класса переделывать в классы и уже оттуда вызывать их функции. Иначе никак. Дурдом. В общем, идея использовать классы в качестве контейнера для хранения и промежуточной обработки данных и поставщика данных для анализа видимо не так уж и удачна, как казалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2009, 15:49 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
YUBA Для решения многих вопросов в этой задаче (не всех) и этого было-бы достаточно. Казалось-бы. :) Но не тут-то было. Это решение не работает - не идет массив по ссылке даже так.Несколько неожиданное суждение. Пусть есть общий модуль (не модуль класса) с расчётными функциями: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Давайте пока с этим небольшим вопросом разберёмся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2009, 18:28 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
БенедиктНесколько неожиданное суждение. Пусть есть общий модуль (не модуль класса) с расчётными функциями: ................................... Риторический вопрос: почему изменилось количество элементов массивов и их значения? Давайте пока с этим небольшим вопросом разберёмся. Бенедикт , как и следовало ожидать, Ваш код работает. Я должен признать, что был неправ в своем утверждении. Однако, мне совершенно непонятно, почему мой, практически аналогичный код не работал 1. Имена переменных в вызове процедуры и модуле класса были разные (в моем топике просто иллюстрация). С этой стороны конфликта быть не может. Процедура вызывалась как ModulName.SubName(...), а код не новый. Ошибка была - аргумент не м.б передан By Ref. 2. Class2 получался из модуля тупым копированием содержания в модуль класса, и вставлением в вызов функции Код: plaintext 1. 2. Вернуть все обратно в том-же виде уже вряд-ли возможно, но попытаюсь смоделировать. Уже просто интересно в чем-же дело было. Сделаю -отпишусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2009, 23:51 |
|
||
|
Получить массив из класса по ссылке
|
|||
|---|---|---|---|
|
#18+
Заставить не работать конструкцию так и не удалось. Теперь о применении всего этого в реальной программе и как это выглядит. М.б. кому пригодится. 1. Создаем некий базовый класс сDate в модуле класса Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Создаем модуль интерфейсов mInterface с интерфейсными методами Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Далее создаем и отдаем указатели на массивы данных на последующую обработку. Ну вот что получилось из этой темы :) Всем спасибо. "Есть многое на свете, друг Горацио, что и не сразу в голову придет." М. Твен "Приключения Геккельбери Финна" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2009, 13:13 |
|
||
|
|

start [/forum/topic.php?fid=60&tid=2160623]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 129ms |

| 0 / 0 |
