WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Переменное число параметров без первого параметра

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Переменное число параметров без первого параметра
Valery опубликован 28-12-2001 13:26 MSK   Click Here to See the Profile for Valery   Click Here to Email Valery  
Кто-нибудь делал так:
void my_func(int first, ...)
{
va_list marker;
va_start(marker, first);
void *f = va_arg(marker, void*);
va_end(marker);
}
очень хорошо! :)
А теперь мне надо вообще избавиться от первого параметра. Мне он как видно нафиг не нужен. Может кто подскажет - как?
Flex Ferrum опубликован 28-12-2001 13:37 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
А нельзя :))) Хотя бы один параметр, но ты должен передать - количество остальных параметров (например). Иначе ты его никак не определишь.
Valery опубликован 28-12-2001 16:30 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
Ну вот, пришлось самому придумывать :) Вот с такой ассемблерной вставочкой получилось, что мне надо было:

DWORD pointer;
__asm
{
push eax
push ebx
lea eax,dword ptr [ebp+12]
mov ebx, [eax]
mov [pointer], ebx
pop ebx
pop eax
}
Теперь в pointer'е валяется то, что я этой функции отдал. Да +12 делается, потому, что она (функция) - член класса. Кто в асме хорошо шарит - покритикуйте пожалста я на какие-нибудь подводные камни наткнусь с такой вставкой или нет?
Да - с учетом того, что передаваться таким образом будут только адреса функций и они не будут даже пытаться вызываться, нужны только для информации внутри класса.
Понимаю, что способ непереносим, зависим от модели памяти, компилятота, фазы Луны и еще Бог знает от чего, вот и прошу - гляньте, а?

Flex Ferrum опубликован 28-12-2001 16:41 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Я думаю, что тебе стоит подумать над дизайном твоей системы, если есть необходимость в подрбных решениях. Отсутвие достаточного контроля типов - не есть хорошо. Есть вероятность, что ошибки потом будешь искать долго и упорно.
rivitna опубликован 28-12-2001 18:22 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
1. "Подводные камни" можно исключить, если отключить прологи и эпилоги функции путем директивы __declspec(naked). Но тогда их придется вставить самому в начале и в конце функции. Код функции в этом случае оптимизироваться не будет. Между прочим, свой код можешь как раз вставить в пролог функции.

2. по ассемблерному коду... Зачем делать лишние шаги? Все может быть гораздо проще!

DWORD pointer;
__asm
{
mov eax,[ebp+12]
mov [pointer],eax
}

Кстати, не надо без надобности трогать регистры ebx, esi, edi, если можно обойтись другими регистрами. В стек также не стоит загонять, оператор __asm это все равно сделает, если это понадобится для сохранения регистров. Однако с директивой __declspec(naked) регистры придется сохранять.

3. Надеюсь, что у тебя как минимум один параметр функции передается. Иначе же при отсутствии параметров pointer будет содержать неопределенное значение.

В принципе особых проблем не вижу.
Так что дерзай!

Valery опубликован 28-12-2001 19:29 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
2Flex Ferrum:
по поводу перепроектирования системы - нечего еще перепроектировать. :) Это во-первых, во-вторых, я же писал уже - адрес функции не используется нигде, кроме разве что операции сравнения. Типизация не нужна (в этом моем конкретном случае). А вообще я очень ревностно отношусь к статической типизации, зря ты так меня. :) Если получится, то что задумал - пообщаемся, обсудим, что ты предложишь, но это будет потом.
2rivitna:
большое спасибо именно за то что я просил сделать - за разбор полетов.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.