![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Ivan. |
|
||||||||||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
Здравствуйте.
Я думаю уже многие оценили преимущества нового компилятора C++11, но для беспокойного программиста все таки остаются вопросы как реализовать ту или иную задачу. У меня вопрос по template-ам. С появлением новых возможностей у меня снова появилось поле для размышления. Уже давно я пытаюсь создать строку с определенными атрибутами и получить на ее указатель непосредственно в месте ее использования. Пример:
Здесь при вызове функции printf компилятор подставляет указатель на заранее подготовленную строку в коде или оперативной памяти. Размещение строк в оперативной или кодовой памяти зависит от нескольких факторов: - атрибут const; - толерантность кодовой и оперативной памяти; - единое или раздельное пространство областей памяти. В моем случаи это микроконтроллер архитектуры AVR8, для которого памяти не толерантны и существуют 2 способа работы с переменными, расположенными в оперативной или кодовой памяти: printf и printf_P. Соответственно и создание переменных производится с разными атрибутами. Например:
Получается, что для вызова функции со строкой, расположенной в кодовой памяти ее нужно заранее создать. Пример:
Вернемся к новому C++11, чем же он поможет нам с этой проблемой: Шаблоны с переменным числом аргументов
Немного напомни новый синтаксис: template<char ...Text> - шаблон с переменным числом аргументов типа char с присвоенным именем Text; sizeof ...(Text) - возвращает количество аргументов; С остальным все как раньше. Что мы получаем?
Правда проблема осталась в том, что и новый C++ так и не научился принимать в качестве аргумента шаблона строку и придется писать следующим образом:
Придумал следующую реализацию:
Но она не работоспособна, так как компилятор ругается на то, что я пытаюсь взять символ строки выходящий за пределы массива. (была строка "Abc", а я пытаюсь взять 4, 5, и т.д. символ. Идем дальше, прибавим к исходной строке еще N байт:
Следующая проблема - каждая строка будет занимать N байт. Эту проблему можно решить с помощью специальных шаблонов:
Конечно код получается очень грамосским, но это вариант работает. Мне не нужно заботится о количестве символов, главное, чтобы не превысить N; Автоматически отсеиваются повторные темплейты и можно вызывать в любой момент:
Я возрадовался, когда решил эту многолетнюю задачу, компилятор с ней справляется довольно быстро и это то, что я хотел. С помощью темплейтов я научился создавать массивы объектов и массивы указателей на объекты, созданные с помощью таких же темплейтах и располагающие данные в кодовой памяти. Но счастье мое было не долгим. Оказывается, что в компиляторе существует предел на количество символов входных данных в теплейт - это 64к развернутых данных. конечно после сборки такой переменной она будет занимать всего пару килобайт, но ее не удается собрать. а каждая моя строка занимает 256 байт (этим я ограничился) независимо от желаемой строки "Abc", сотня таких строк съест 24к символов прекомпилятора как минимум (имеется ввиду если они будут посланы в один какой то очень сложный темплейт). Вопрос, какой еще можно придумать способ создания строки не упираясь в данные ограничения компилятора? -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
||||||||||||||||||||
|
|||||||||||||||||||||
korian |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
ндя, не понимаю, почему не придумали в компиляторе под avr что-то типа
P"My String", по типу как L"My string" для wchar_t думаю надо порыть в сторону увеличения ограниченый компилятора, если у него есть такие параметры... |
|||
|
||||
alexSl |
|
|||
![]() проходил мимо Профиль Группа: Участник Сообщений: 28 Регистрация: 22.2.2008 Репутация: нет Всего: нет |
Может быть умные указатели ? |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
> В моем случаи это микроконтроллер архитектуры AVR8
> преимущества нового компилятора C++11 если не секрет, что за компилятор си++ 11 под микроконтроллер? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
avrgcc-4.7.0-avrlibc-1.8.0 поддерживает c++11 гугли. есть скомпиленный для винды
-------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
rodnover |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: нет Всего: 10 |
http://habrahabr.ru/post/140357/
Это не то? Переопределение собственных литералов. Правда сам этим еще так и не пользовался. Только читал. |
|||
|
||||
Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
литералы читал, строковые литералы выполняются в рантайме, а сырые литералы сводятся к темплейтам и возвращаемся к проблеме №1
-------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
korian |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
Все-таки, все уже "украдено" за нас
![]() http://www.avrfreaks.net/index.php?name=PN...p;postorder=asc
|
|||
|
||||
Ivan. |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
у меня проблема не в использовании, а в объявлении. в том примере он сперва создает строку с различными атрибутами, а уже потом присваивает к "Умному" указателю -------------------- Я могу ВСЁ, вопрос - сколько времени у меня это займет! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |