Автор
|
Тема: Переменное число параметров без первого параметра
|
Valery |
опубликован 28-12-2001 13:26 MSK
Кто-нибудь делал так: 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
А нельзя :))) Хотя бы один параметр, но ты должен передать - количество остальных параметров (например). Иначе ты его никак не определишь. |
Valery
|
опубликован 28-12-2001 16:30 MSK
Ну вот, пришлось самому придумывать :) Вот с такой ассемблерной вставочкой получилось, что мне надо было: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
Я думаю, что тебе стоит подумать над дизайном твоей системы, если есть необходимость в подрбных решениях. Отсутвие достаточного контроля типов - не есть хорошо. Есть вероятность, что ошибки потом будешь искать долго и упорно. |
rivitna
|
опубликован 28-12-2001 18:22 MSK
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
2Flex Ferrum: по поводу перепроектирования системы - нечего еще перепроектировать. :) Это во-первых, во-вторых, я же писал уже - адрес функции не используется нигде, кроме разве что операции сравнения. Типизация не нужна (в этом моем конкретном случае). А вообще я очень ревностно отношусь к статической типизации, зря ты так меня. :) Если получится, то что задумал - пообщаемся, обсудим, что ты предложишь, но это будет потом. 2rivitna: большое спасибо именно за то что я просил сделать - за разбор полетов. |