2014-02-05 3 views
0

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

A Trie - все об эффективности и производительности, поэтому большинство других языков программирования используют тип данных Char для представления членов TrieNodes. Поскольку VBA не имеет типа данных Char, я думал о , обманом и используя fixed-length String с 1 символом.

  • Примечание: Я могу придумать обход для этого, т.е. используйте Byte и простую функцию для преобразования между Chr() и Asc() или Enum, или delcare как private str as String * 1, и используйте преимущества get/let, но это не главное. Оставайтесь с нами, потому что ...

В соответствии с Public Statement on Microsoft Help Page вы не можете объявить переменную String фиксированной длины в модулях классов.

enter image description here

Я не могу найти любой разумного объяснения этого стеснять.

Может ли кто-нибудь объяснить, почему такое ограничение применяется к строкам фиксированной длины в модульных модулях в VBA?

+1

Все это основано на архитектуре COM/OLE, поэтому эти ограничения существуют, потому что семантика публичного типа в открытом классе должна быть описана для любого возможного потребителя этого класса, а VBA не может сделать это для строки фиксированной длины, ее не описываемый тип (например, не аналоговый в IDL/ODL), а скорее (я бы парировал), это обычная строка с генерируемым компилятором защитным кодом. –

ответ

3

Среда выполнения VBA/VB6 в значительной степени зависит от системы COM (oleaut32 и др.), И это обеспечивает соблюдение некоторых правил.

Вы можете экспортировать класс flile между VB «stuff», но если вы публикуете (или можете теоретически публиковать) его как COM-объект, он должен иметь возможность описать «строку фиксированной длины» в своей библиотеке описания/типа интерфейса, поэтому которые говорят, что клиент C++ может его использовать.

Строка фиксированной длины является «специальной», поскольку она имеет активное поведение, то есть ее не является немым типом данных, она ведет себя как класс; например, он всегда дополняется - если вы назначаете ему, у него будут конечные пробелы, в VBA компилятор добавляет сгенерированный код для получения этого поведения. Потребитель C++ не знает о природе строки с фиксированной длиной, потому что интерфейс не может описать ее/не поддерживает соответствующий тип (String - BSTR), что может привести к проблемам.

Строки имеют тип BSTR и как массив байтов, вы все равно потеряете семантику дополнения, если вы использовали один из них.

Смежные вопросы