Переменное число параметров но....
От: Аноним  
Дата: 21.06.04 15:04
Оценка:
Итак, господа,
есть фунуция

foo1(...)

объяленная именно вот так. И которой другая функция передает один аргумент.
В связи с этим импользовать va_start не получается так как нет ни одного формального параметра.
Вопрос, как достучатся до этого параметра если заведом известно что он один и больше не бывает?
Re: Переменное число параметров но....
От: Amor Россия  
Дата: 21.06.04 15:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Итак, господа,

А>есть фунуция

А>
А>foo1(...) 
А>

А>объяленная именно вот так. И которой другая функция передает один аргумент.
А>В связи с этим импользовать va_start не получается так как нет ни одного формального параметра.
А>Вопрос, как достучатся до этого параметра если заведом известно что он один и больше не бывает?

Обратимся к реализации на уровне кода.
Вызов такой фукнции представляется примерно так (для одного параметра).

push /*параметр 1*/
call foo1
add esp, 4

если для двух параметров
push /*параметр 1*/
push /*параметр 2*/
call foo1
add esp, 8

и так далее.

Из этого следует, что функция foo1 сама по себе не знает сколько параметров ты ей передаешь.
И ей необходимо передавать эту информацию, любыми способами (хоть через глобальные переменные — пофиг). но сама, без вашей помощи этого не узнает.
Re: Переменное число параметров но....
От: rus blood Россия  
Дата: 21.06.04 15:52
Оценка:
А>объяленная именно вот так. И которой другая функция передает один аргумент.
А>В связи с этим импользовать 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);
}


Хотя, конечно, остается проблема с определением числа параметров.
Можно в параметрах передавать какой-нить стоп-признак...

ЗЫ
Ессно, под x86, компилер MSVC...
Имею скафандр — готов путешествовать!
Re[2]: Переменное число параметров но....
От: Павел Кузнецов  
Дата: 21.06.04 18:31
Оценка: +1
> Параметры кладутся в обратном порядке с стек, после чего во время вызова call кладется еще адрес возврата, после чего в ebp кладется адрес, следующий за адресом возврата. Т.е. параметры функции наичинаются с адреса ebp+8
> <...>
>     //va_start(marker, ebp + 8);
>     __asm
>     {
>         mov marker, ebp
>         add marker, 8
>     }
>
<...>

> Ессно, под x86, компилер MSVC...

И, естественно, если не включена оптимизация /Oy, которая по умолчанию в "Release" таки включена. Соответственно, в "Release" будет все что угодно, но не переданные аргументы. В общем, лучше так не делать.
Posted via RSDN NNTP Server 1.9 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Переменное число параметров но....
От: _nn_ www.nemerleweb.com
Дата: 22.06.04 05:02
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Итак, господа,

А>есть фунуция

А>
А>foo1(...) 
А>

А>объяленная именно вот так. И которой другая функция передает один аргумент.
А>В связи с этим импользовать va_start не получается так как нет ни одного формального параметра.
А>Вопрос, как достучатся до этого параметра если заведом известно что он один и больше не бывает?
Если он один тогда зачем делать функцию с переменным числом параметров ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Переменное число параметров но....
От: itman itman.livejournal.com
Дата: 22.06.04 05:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Итак, господа,

А>есть фунуция

А>
А>foo1(...) 
А>

А>объяленная именно вот так. И которой другая функция передает один аргумент.
А>В связи с этим импользовать va_start не получается так как нет ни одного формального параметра.
А>Вопрос, как достучатся до этого параметра если заведом известно что он один и больше не бывает?


И вот недаром же в чистом Cи, не знаю, как в плюсах, говорится, что перед ... должен быть хотя бы один аргумент!!!
Re[2]: Переменное число параметров но....
От: Аноним  
Дата: 22.06.04 05:54
Оценка:
Здравствуйте, itman, Вы писали:

I>Здравствуйте, Аноним, Вы писали:


А>>Итак, господа,

А>>есть фунуция

А>>
А>>foo1(...) 
А>>

А>>объяленная именно вот так. И которой другая функция передает один аргумент.
А>>В связи с этим импользовать va_start не получается так как нет ни одного формального параметра.
А>>Вопрос, как достучатся до этого параметра если заведом известно что он один и больше не бывает?


I>И вот недаром же в чистом Cи, не знаю, как в плюсах, говорится, что перед ... должен быть хотя бы один аргумент!!!


Вот и проблема именно в этом. Поменять функцию не могу — ибо это API не мной придуманнное.

Вот и стоит вопрос: ЧТО ДЕЛАТЬ?????
Re[3]: Переменное число параметров но....
От: itman itman.livejournal.com
Дата: 22.06.04 06:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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 должна быть описана как (*) (...)

И продавить другое ну никак нельзя. Глобальная переменная.... ну раэве что единственное остается
Re[5]: Переменное число параметров но....
От: Amor Россия  
Дата: 22.06.04 06:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, itman, Вы писали:


А>>>Вот и проблема именно в этом. Поменять функцию не могу — ибо это API не мной придуманнное.


А>>>Вот и стоит вопрос: ЧТО ДЕЛАТЬ?????


I>>Во-первых, поясните, откуда берется число параметров и их описание? Глобальные переменные?

I>>А, вообще, по-моему стоит продавить другое АПИ, что за идиотское требование про нулевое число аргументов. К тому же, он стандарту ИМХО не удовлетворяет.

А>Угу, есть такая операционка vxWorks нвзывется, так там такое поределение сплощь и рядом


А>например функция вызова

А>wdStart (id,timeout, CallbackFunction, param)

А>вот эта CallbackFunction должна быть описана как (*) (...)


А>И продавить другое ну никак нельзя. Глобальная переменная.... ну раэве что единственное остается


На счет количества параметров, это уж понятно, либо заранее известно сколько параметров передадутся из wdStart, либо как-то во время выполнения (глобальные или еще как).
А насчет того, как достучаться.
Есть ведь такая типа-функция _ReturnAddress() называется, покрайней мере на VC6.0 работает, может от нее и плясать.
И с Релизом вроде тож проблем нет. У меня все работает.
Re[5]: Переменное число параметров но....
От: Leonid V. Volnin Россия  
Дата: 22.06.04 06:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Угу, есть такая операционка vxWorks нвзывется, так там такое поределение сплощь и рядом


А>например функция вызова

А>wdStart (id,timeout, CallbackFunction, param)

А>вот эта CallbackFunction должна быть описана как (*) (...)


А>И продавить другое ну никак нельзя. Глобальная переменная.... ну раэве что единственное остается


А кастингом это дело забороть никак разве нельзя? если вы знаете количество параметров, которые будут переданы в вашу функцию (одна штука), то
void my_callback(int param);
...
wdStart(id,timeout,(CallbackFunction)my_callback,param);
best regards, Leonid
Re[5]: Переменное число параметров но....
От: Шахтер Интернет  
Дата: 22.06.04 23:08
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, itman, Вы писали:


А>>>Вот и проблема именно в этом. Поменять функцию не могу — ибо это API не мной придуманнное.


А>>>Вот и стоит вопрос: ЧТО ДЕЛАТЬ?????


I>>Во-первых, поясните, откуда берется число параметров и их описание? Глобальные переменные?

I>>А, вообще, по-моему стоит продавить другое АПИ, что за идиотское требование про нулевое число аргументов. К тому же, он стандарту ИМХО не удовлетворяет.

А>Угу, есть такая операционка vxWorks нвзывется, так там такое поределение сплощь и рядом


А>например функция вызова

А>wdStart (id,timeout, CallbackFunction, param)

А>вот эта CallbackFunction должна быть описана как (*) (...)


Спокойно, вы просто не просекли суть. На самом деле она вызывается как CallbackFun(int param). Нужно завести обычную функцию void fun(int), и сделать так

wdStart(id,timeout,(FUNCPTR)fun,param);

А>И продавить другое ну никак нельзя. Глобальная переменная.... ну раэве что единственное остается


Не надо никаких глобальных переменных.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[6]: Переменное число параметров но....
От: itman itman.livejournal.com
Дата: 23.06.04 07:30
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Здравствуйте, <Аноним>, Вы писали:


А>>Здравствуйте, itman, Вы писали:


А>>>>Вот и проблема именно в этом. Поменять функцию не могу — ибо это API не мной придуманнное.


А>>>>Вот и стоит вопрос: ЧТО ДЕЛАТЬ?????


I>>>Во-первых, поясните, откуда берется число параметров и их описание? Глобальные переменные?

I>>>А, вообще, по-моему стоит продавить другое АПИ, что за идиотское требование про нулевое число аргументов. К тому же, он стандарту ИМХО не удовлетворяет.

А>>Угу, есть такая операционка vxWorks нвзывется, так там такое поределение сплощь и рядом


А>>например функция вызова

А>>wdStart (id,timeout, CallbackFunction, param)

А>>вот эта CallbackFunction должна быть описана как (*) (...)


Ш>Спокойно, вы просто не просекли суть. На самом деле она вызывается как CallbackFun(int param). Нужно завести обычную функцию void fun(int), и сделать так


Ш>wdStart(id,timeout,(FUNCPTR)fun,param);


А>>И продавить другое ну никак нельзя. Глобальная переменная.... ну раэве что единственное остается


Ш>Не надо никаких глобальных переменных.


а как понять, что там будет один параметр???? если он всегда один, то тогда зачем нужны ...?
Re[7]: Переменное число параметров но....
От: Шахтер Интернет  
Дата: 24.06.04 00:56
Оценка:
Здравствуйте, 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 е написан грязно.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.