Здравствуйте, Аноним, Вы писали:
А>Можно ли из функции, принимающей переменное число параметров, передать все эти параметры в другую функцию с переменным числом параметров?
1) смотри семейство vprintf/vsprintf/vfprintf
2) делается так
Здравствуйте, Аноним, Вы писали:
А>Можно ли из функции, принимающей переменное число параметров, передать все эти параметры в другую функцию с переменным числом параметров?
А>Что-то типа: А>
Конкретно здесь можно использовать ф-ю vsprintf. Другая проблема это запихнуть в printf неизвестное число параметров, приходящее в ф-юю в виде например вектора. Я её решал с помощью хака.
Здравствуйте, Аноним, Вы писали:
А>Можно ли из функции, принимающей переменное число параметров, передать все эти параметры в другую функцию с переменным числом параметров?
А>Что-то типа: А>
2. Если же задача стоит чётко, как именно передать аргументы из внешней функции использующей ellipsis во внутреннюю, также использующую ellipsis, то это можно сделать только если твой компилятор поддерживает переменное число параметров в макросах, в gcc это вроде бы должно выглядеть так:
Don't crash the ambulance, whatever you do!
ICQ#327823673
In her dealings with man Destiny never closed her accounts. (c) Oscar Wilde
Re[2]: Как передать (...) дальше
От:
Аноним
Дата:
10.12.04 08:44
Оценка:
Здравствуйте, korzhik, Вы писали:
K>2. Если же задача стоит чётко, как именно передать аргументы из внешней функции использующей ellipsis во внутреннюю, также использующую ellipsis, то это можно сделать только если твой компилятор поддерживает переменное число параметров в макросах, в gcc это вроде бы должно выглядеть так: K>
Именно так задача и стоит. Пример с printf-ом просто первое что пришло в голову. Функция должна принимать именно (...), а не va_list.
А можно ли обойтись без макросов, а именно функцией, которая просто транзитом передает набор аргументов дальше (ну там делает еще свои дела предварительно)?
Здравствуйте, Аноним, Вы писали:
А>Именно так задача и стоит. Пример с printf-ом просто первое что пришло в голову. Функция должна принимать именно (...), а не va_list.
А>А можно ли обойтись без макросов, а именно функцией, которая просто транзитом передает набор аргументов дальше (ну там делает еще свои дела предварительно)?
Только через хак.
Или, если ты знаешь, что там не более N параметров и типы их известны на стадии компиляции — то запихать их все (возможно, с пустышками).
Здравствуйте, Кодт, Вы писали:
К>Только через хак.
Понятно. Очень жаль
К>Или, если ты знаешь, что там не более N параметров и типы их известны на стадии компиляции — то запихать их все (возможно, с пустышками).
Да нет, это уже совсем изврат получается.
Здравствуйте, Аноним, Вы писали:
K>>2. Если же задача стоит чётко, как именно передать аргументы из внешней функции использующей ellipsis во внутреннюю, также использующую ellipsis
А>Именно так задача и стоит. Пример с printf-ом просто первое что пришло в голову. Функция должна принимать именно (...), а не va_list. А>А можно ли обойтись без макросов, а именно функцией, которая просто транзитом передает набор аргументов дальше (ну там делает еще свои дела предварительно)?
хммм, сейчас решения не знаю, думать надо однако
Думаю что в общем случае,даже если решение существует, оно врятли будет переносимо и красиво.
Единственное что может облегчить задачу, это если ты можешь менять код внутренней функции.
Тогда в неё можно передать указатель на va_list.
Здравствуйте, Аноним,
А>А можно ли обойтись без макросов, а именно функцией, которая просто транзитом передает набор аргументов дальше (ну там делает еще свои дела предварительно)?
ИМХО нет.
Don't crash the ambulance, whatever you do!
ICQ#327823673
In her dealings with man Destiny never closed her accounts. (c) Oscar Wilde
Здравствуйте, Аноним, Вы писали:
К>>Только через хак. А>Понятно. Очень жаль
К>>Или, если ты знаешь, что там не более N параметров и типы их известны на стадии компиляции — то запихать их все (возможно, с пустышками). А>Да нет, это уже совсем изврат получается.
Неужели нельзя переделать всё так, чтобы без эллипса было? Или ты к сторонней библиотеке что-то прикручиваешь?
Перекуём баги на фичи!
Re[6]: Как передать (...) дальше
От:
Аноним
Дата:
10.12.04 09:25
Оценка:
Здравствуйте, Кодт, Вы писали: К>Неужели нельзя переделать всё так, чтобы без эллипса было? Или ты к сторонней библиотеке что-то прикручиваешь?
Можно. Все исходники доступны для правки.
Просто в исходной функции было так:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Кодт, Вы писали: К>>Неужели нельзя переделать всё так, чтобы без эллипса было? Или ты к сторонней библиотеке что-то прикручиваешь?
А>Можно. Все исходники доступны для правки.
Вопрос номер раз: Принимает ли ::Send гомогенные или гетерогенные данные? Например, произвольное количество int'ов или некую мешанину типов?
Вопрос номер два: Можно ли гомогенизировать данные естественным образом? Например, у printf — это приведение к строковому типу.
Вопрос номер три: можно ли выполнить декомпозицию? Например, printf можно разложить на последовательность операций с каждым данным по отдельности, как, например, вывод в cout<<x<<y<<z
Посылку переменной длины можно упаковать в контейнер — например, vector или list.
Гетерогенные данные — или привести к гомогенному виду (к той же строке), или обернуть — например, VARIANT, boost::any и т.п., или сделать шаблон функции, принимающей их.
Здравствуйте, <Аноним>, Вы писали:
А>Можно ли из функции, принимающей переменное число параметров, передать все эти параметры в другую функцию с переменным числом параметров?
Главное -- оно всё работает, и printf прекрасно всё выводит. Вот только после такой "игры" MSVC ругается, что стек вокруг s порушен . Может кто знает, как решить эту проблему?
Я пытался. Записывал в esp старое значение. Но в этом случае... программа замирала! Под отладчиком видел, что esp постоянно меняется .
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, Аноним, Вы писали:
А>>Можно. Все исходники доступны для правки.
K>тогда, не изменяя интерфейса, можно сделать следующее:
воспользоваться шаблонами как здесь
Здравствуйте, Аноним, Вы писали:
А>Можно ли из функции, принимающей переменное число параметров, передать все эти параметры в другую функцию с переменным числом параметров?
А>Что-то типа: А>