![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
YouROK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 21.7.2011 Репутация: нет Всего: нет |
Есть строка допустим "printf(\"%s %d\"); chars:\"Hello world\", int:25;"
Моя функция парсит строку получаем строку char *paramstr = "%s %d" и список или что то в этом роде пока еще не определился 1)char* "Hello world" 2)int 25 далее идет вызов printf(paramstr,тут как-то надо вставить эти параметры); думал как-нибудь собрать va_list но там работа со стеком, что без ассемблера не сделаешь???? подскажите кто-нибудь, может через boost можно как-то или стандартными способами c++? Это сообщение отредактировал(а) YouROK - 29.12.2011, 15:27 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
нифига не понял
![]() |
|||
|
||||
YouROK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 21.7.2011 Репутация: нет Всего: нет |
в программу ко мне по сети приходит строка
"printf(\"%s %d\"); chars:\"Hello world\", int:25;" моя программа должна вызвать функцию с этими аргументам функция одна, а вот аргументы все время разные и количество их тоже меняется. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
распарсив эту часть, ты получаешь массив указателей на токены, и узнаешь кол-во аргументов. далее, итерируйся по списку полученных указателей и выводи при помощи std::cout |
|||
|
||||
YouROK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 21.7.2011 Репутация: нет Всего: нет |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
так передай в функцию список указателей. в чем сложность?
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
YouROK, такое действительно можно делать или на ассемблере, или перебирать в коде все возможные варианты (т.е. сделать код для всех возможных комбинаций параметров).
Мой тебе совет, пересмотри вообще постановку задачи, так как подобное решение не только трудно реализуемо, но и сильно снижает надежность кода. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
варианты чего? он получает строки. варианты строк? ![]() т.е. перегрузить функцию для всех возможных типов и количеств аргументов?. повторяю: он получает только строки. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
варианты наборов аргументов функций.
|
|||
|
||||
YouROK |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 21.7.2011 Репутация: нет Всего: нет |
Видимо придется делать 6 функций с разным количеством параметров, думаю больше 5 аргументов не будет.
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
зачем?
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Теоретически, можно постараться реализовать всё это через va_list. Однако в таком случае передача неверных аргументов может завершить Вашу программу сигфолтом. Как минимум, Вам придётся проверять соответствие форматов в строке printf и передаваемых ей аргументов. То есть разбирать форматную строку.
Я всё же предлагаю реализовать задачу иначе. Простите, запишу всё через struct, легко можно будет перепесать и через классы.
Это сообщение отредактировал(а) feodorv - 6.1.2012, 23:53 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Вариант с va_list имеет еще один недостаток - этот самый va_list очень компиляторно и системное зависим. Недавно столкнулся - на 64х битном х86 этот самый лист не void*, как у всех, а массив (из 1 элемента) весьма развесистой структуры
|
|||
|
||||
586 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 10 Всего: 146 |
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |