объяленная именно вот так. И которой другая функция передает один аргумент.
В связи с этим импользовать va_start не получается так как нет ни одного формального параметра.
Вопрос, как достучатся до этого параметра если заведом известно что он один и больше не бывает?
Здравствуйте, Аноним, Вы писали:
А>Итак, господа, А>есть фунуция
А>
А>foo1(...)
А>
А>объяленная именно вот так. И которой другая функция передает один аргумент. А>В связи с этим импользовать va_start не получается так как нет ни одного формального параметра. А>Вопрос, как достучатся до этого параметра если заведом известно что он один и больше не бывает?
Обратимся к реализации на уровне кода.
Вызов такой фукнции представляется примерно так (для одного параметра).
Из этого следует, что функция foo1 сама по себе не знает сколько параметров ты ей передаешь.
И ей необходимо передавать эту информацию, любыми способами (хоть через глобальные переменные — пофиг). но сама, без вашей помощи этого не узнает.
А>объяленная именно вот так. И которой другая функция передает один аргумент. А>В связи с этим импользовать va_start не получается так как нет ни одного формального параметра. А>Вопрос, как достучатся до этого параметра если заведом известно что он один и больше не бывает?
Параметры кладутся в обратном порядке с стек, после чего во время вызова call кладется еще адрес возврата, после чего в ebp кладется адрес, следующий за адресом возврата. Т.е. параметры функции наичинаются с адреса ebp+8
void Func(...)
{
va_list marker;
//va_start(marker, ebp + 8);__asm
{
mov marker, ebp
add marker, 8
}
for (int i = 0; i < 3; i++)
{
int u = va_arg(marker, int);
}
va_end(marker);
}
...
int main(...)
{
Func(1, 2, 3);
}
Хотя, конечно, остается проблема с определением числа параметров.
Можно в параметрах передавать какой-нить стоп-признак...
> Параметры кладутся в обратном порядке с стек, после чего во время вызова call кладется еще адрес возврата, после чего в ebp кладется адрес, следующий за адресом возврата. Т.е. параметры функции наичинаются с адреса ebp+8 > <...>
И, естественно, если не включена оптимизация /Oy, которая по умолчанию в "Release" таки включена. Соответственно, в "Release" будет все что угодно, но не переданные аргументы. В общем, лучше так не делать.
Posted via RSDN NNTP Server 1.9 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Аноним, Вы писали:
А>Итак, господа, А>есть фунуция
А>
А>foo1(...)
А>
А>объяленная именно вот так. И которой другая функция передает один аргумент. А>В связи с этим импользовать va_start не получается так как нет ни одного формального параметра. А>Вопрос, как достучатся до этого параметра если заведом известно что он один и больше не бывает?
Если он один тогда зачем делать функцию с переменным числом параметров ?
Здравствуйте, Аноним, Вы писали:
А>Итак, господа, А>есть фунуция
А>
А>foo1(...)
А>
А>объяленная именно вот так. И которой другая функция передает один аргумент. А>В связи с этим импользовать va_start не получается так как нет ни одного формального параметра. А>Вопрос, как достучатся до этого параметра если заведом известно что он один и больше не бывает?
И вот недаром же в чистом Cи, не знаю, как в плюсах, говорится, что перед ... должен быть хотя бы один аргумент!!!
Re[2]: Переменное число параметров но....
От:
Аноним
Дата:
22.06.04 05:54
Оценка:
Здравствуйте, itman, Вы писали:
I>Здравствуйте, Аноним, Вы писали:
А>>Итак, господа, А>>есть фунуция
А>>
А>>foo1(...)
А>>
А>>объяленная именно вот так. И которой другая функция передает один аргумент. А>>В связи с этим импользовать va_start не получается так как нет ни одного формального параметра. А>>Вопрос, как достучатся до этого параметра если заведом известно что он один и больше не бывает?
I>И вот недаром же в чистом Cи, не знаю, как в плюсах, говорится, что перед ... должен быть хотя бы один аргумент!!!
Вот и проблема именно в этом. Поменять функцию не могу — ибо это API не мной придуманнное.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, itman, Вы писали:
I>>Здравствуйте, Аноним, Вы писали:
А>>>Итак, господа, А>>>есть фунуция
А>>>
А>>>foo1(...)
А>>>
А>>>объяленная именно вот так. И которой другая функция передает один аргумент. А>>>В связи с этим импользовать va_start не получается так как нет ни одного формального параметра. А>>>Вопрос, как достучатся до этого параметра если заведом известно что он один и больше не бывает?
I>>И вот недаром же в чистом Cи, не знаю, как в плюсах, говорится, что перед ... должен быть хотя бы один аргумент!!!
А>Вот и проблема именно в этом. Поменять функцию не могу — ибо это API не мной придуманнное.
А>Вот и стоит вопрос: ЧТО ДЕЛАТЬ?????
Во-первых, поясните, откуда берется число параметров и их описание? Глобальные переменные?
А, вообще, по-моему стоит продавить другое АПИ, что за идиотское требование про нулевое число аргументов. К тому же, он стандарту ИМХО не удовлетворяет.
Re[4]: Переменное число параметров но....
От:
Аноним
Дата:
22.06.04 06:33
Оценка:
Здравствуйте, itman, Вы писали:
А>>Вот и проблема именно в этом. Поменять функцию не могу — ибо это API не мной придуманнное.
А>>Вот и стоит вопрос: ЧТО ДЕЛАТЬ?????
I>Во-первых, поясните, откуда берется число параметров и их описание? Глобальные переменные? I>А, вообще, по-моему стоит продавить другое АПИ, что за идиотское требование про нулевое число аргументов. К тому же, он стандарту ИМХО не удовлетворяет.
Угу, есть такая операционка vxWorks нвзывется, так там такое поределение сплощь и рядом
например функция вызова
wdStart (id,timeout, CallbackFunction, param)
вот эта CallbackFunction должна быть описана как (*) (...)
И продавить другое ну никак нельзя. Глобальная переменная.... ну раэве что единственное остается
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, itman, Вы писали:
А>>>Вот и проблема именно в этом. Поменять функцию не могу — ибо это API не мной придуманнное.
А>>>Вот и стоит вопрос: ЧТО ДЕЛАТЬ?????
I>>Во-первых, поясните, откуда берется число параметров и их описание? Глобальные переменные? I>>А, вообще, по-моему стоит продавить другое АПИ, что за идиотское требование про нулевое число аргументов. К тому же, он стандарту ИМХО не удовлетворяет.
А>Угу, есть такая операционка vxWorks нвзывется, так там такое поределение сплощь и рядом
А>например функция вызова А>wdStart (id,timeout, CallbackFunction, param)
А>вот эта CallbackFunction должна быть описана как (*) (...)
А>И продавить другое ну никак нельзя. Глобальная переменная.... ну раэве что единственное остается
На счет количества параметров, это уж понятно, либо заранее известно сколько параметров передадутся из wdStart, либо как-то во время выполнения (глобальные или еще как).
А насчет того, как достучаться.
Есть ведь такая типа-функция _ReturnAddress() называется, покрайней мере на VC6.0 работает, может от нее и плясать.
И с Релизом вроде тож проблем нет. У меня все работает.
Здравствуйте, Аноним, Вы писали:
А>Угу, есть такая операционка vxWorks нвзывется, так там такое поределение сплощь и рядом
А>например функция вызова А>wdStart (id,timeout, CallbackFunction, param)
А>вот эта CallbackFunction должна быть описана как (*) (...)
А>И продавить другое ну никак нельзя. Глобальная переменная.... ну раэве что единственное остается
А кастингом это дело забороть никак разве нельзя? если вы знаете количество параметров, которые будут переданы в вашу функцию (одна штука), то
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, itman, Вы писали:
А>>>Вот и проблема именно в этом. Поменять функцию не могу — ибо это API не мной придуманнное.
А>>>Вот и стоит вопрос: ЧТО ДЕЛАТЬ?????
I>>Во-первых, поясните, откуда берется число параметров и их описание? Глобальные переменные? I>>А, вообще, по-моему стоит продавить другое АПИ, что за идиотское требование про нулевое число аргументов. К тому же, он стандарту ИМХО не удовлетворяет.
А>Угу, есть такая операционка vxWorks нвзывется, так там такое поределение сплощь и рядом
А>например функция вызова А>wdStart (id,timeout, CallbackFunction, param)
А>вот эта CallbackFunction должна быть описана как (*) (...)
Спокойно, вы просто не просекли суть. На самом деле она вызывается как CallbackFun(int param). Нужно завести обычную функцию void fun(int), и сделать так
wdStart(id,timeout,(FUNCPTR)fun,param);
А>И продавить другое ну никак нельзя. Глобальная переменная.... ну раэве что единственное остается
Здравствуйте, Шахтер, Вы писали:
Ш>Здравствуйте, <Аноним>, Вы писали:
А>>Здравствуйте, itman, Вы писали:
А>>>>Вот и проблема именно в этом. Поменять функцию не могу — ибо это API не мной придуманнное.
А>>>>Вот и стоит вопрос: ЧТО ДЕЛАТЬ?????
I>>>Во-первых, поясните, откуда берется число параметров и их описание? Глобальные переменные? I>>>А, вообще, по-моему стоит продавить другое АПИ, что за идиотское требование про нулевое число аргументов. К тому же, он стандарту ИМХО не удовлетворяет.
А>>Угу, есть такая операционка vxWorks нвзывется, так там такое поределение сплощь и рядом
А>>например функция вызова А>>wdStart (id,timeout, CallbackFunction, param)
А>>вот эта CallbackFunction должна быть описана как (*) (...)
Ш>Спокойно, вы просто не просекли суть. На самом деле она вызывается как CallbackFun(int param). Нужно завести обычную функцию void fun(int), и сделать так
Ш>wdStart(id,timeout,(FUNCPTR)fun,param);
А>>И продавить другое ну никак нельзя. Глобальная переменная.... ну раэве что единственное остается
Ш>Не надо никаких глобальных переменных.
а как понять, что там будет один параметр???? если он всегда один, то тогда зачем нужны ...?
Здравствуйте, itman, Вы писали:
I>Здравствуйте, Шахтер, Вы писали:
Ш>>Здравствуйте, <Аноним>, Вы писали:
А>>>Здравствуйте, itman, Вы писали:
А>>>>>Вот и проблема именно в этом. Поменять функцию не могу — ибо это API не мной придуманнное.
А>>>>>Вот и стоит вопрос: ЧТО ДЕЛАТЬ?????
I>>>>Во-первых, поясните, откуда берется число параметров и их описание? Глобальные переменные? I>>>>А, вообще, по-моему стоит продавить другое АПИ, что за идиотское требование про нулевое число аргументов. К тому же, он стандарту ИМХО не удовлетворяет.
А>>>Угу, есть такая операционка vxWorks нвзывется, так там такое поределение сплощь и рядом
А>>>например функция вызова А>>>wdStart (id,timeout, CallbackFunction, param)
А>>>вот эта CallbackFunction должна быть описана как (*) (...)
Ш>>Спокойно, вы просто не просекли суть. На самом деле она вызывается как CallbackFun(int param). Нужно завести обычную функцию void fun(int), и сделать так
Ш>>wdStart(id,timeout,(FUNCPTR)fun,param);
А>>>И продавить другое ну никак нельзя. Глобальная переменная.... ну раэве что единственное остается
Ш>>Не надо никаких глобальных переменных.
I>а как понять, что там будет один параметр????
1 вариант -- почитать документацию по "злой собаке"
2 вариант (на худой конец) -- спросить в форуме
I>если он всегда один, то тогда зачем нужны ...?
Потому что системный интерфейс в vxWorks е написан грязно.