Форум программистов, компьютерный форум CyberForum.ru

Как передать в функцию заранее неизвестное число параметров? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 4.00
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
01.07.2014, 20:47     Как передать в функцию заранее неизвестное число параметров? #1
как передать в функцию "func" разное число параметров? писать для каждого перегрузку, или можно передать array int??
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2014, 20:47     Как передать в функцию заранее неизвестное число параметров?
Посмотрите здесь:

C++ Как передать в функцию указатель на двумерный массив заранее неизвестного размера?
Как передать указатель на функцию в функцию C++
C++ Передать в функцию целое число. Функция заменяет его на ближайшее простое число, которое больше или меньше исходного. Вернуться в main( ) и распечатат
C++ Cоздание неизвестное заранее количество переменных
Как передать в функцию число и структуру побайтно? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,476
01.07.2014, 20:51     Как передать в функцию заранее неизвестное число параметров? #2
Разное число однотипных или разнотипных?
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
01.07.2014, 21:01  [ТС]     Как передать в функцию заранее неизвестное число параметров? #3
однотипных, все равно в стеке все 32битное.

Добавлено через 28 секунд
и еще вопрос почему так нельзя
C++
1
void (*func)(LPVOID Text,LPVOID Type,LPVOID Target)=(LPVOID)0x12345678;
nmcf
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,476
01.07.2014, 21:01     Как передать в функцию заранее неизвестное число параметров? #4
Ну тогда передавай ссылку на массив с этими параметрами и их количество.
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
01.07.2014, 21:04  [ТС]     Как передать в функцию заранее неизвестное число параметров? #5
Нет не получиться, передасть ссылка на массив и все
push array
call 0x12345678

а надо
push 1
push 2
push 3
...
push n
call 0x12345678
nmcf
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,476
01.07.2014, 21:08     Как передать в функцию заранее неизвестное число параметров? #6
Ассемблер-то тут причём?
Чем плоха ссылка? Надо обязательно в стек их помещать?
Используй тогда многоточие. http://ci-plus-plus-snachala.ru/?p=63
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 1
01.07.2014, 21:12     Как передать в функцию заранее неизвестное число параметров? #7
Почитайте это
http://www.rsdn.ru/forum/cpp/418970.1
Вот пример оттуда
C++
1
2
3
4
5
6
7
8
9
10
double f(double n, ...)    //--заголовок с переменным числом параметров
{   double *p = &n;        //--установились на начало списка параметров
    double sum = 0, count = 0;    
    while (*p)         //--пока аргумент не равен нулю
    { sum+=(*p);         //--суммируем аргумент
      p++;             //--«перемещаемся на следующий аргумент
      count++;         //--считаем  количество аргументов
    }
    return ((sum)?sum/count:0);    //--вычисляем среднее
}
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
01.07.2014, 21:12  [ТС]     Как передать в функцию заранее неизвестное число параметров? #8
то что надо!!! просто параметры передаются в не управляеймый код(
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
01.07.2014, 21:14     Как передать в функцию заранее неизвестное число параметров? #9
Цитата Сообщение от zss Посмотреть сообщение
Почитайте это
Не, не надо это читать, разве что в качестве примера, как делать НЕ нужно. Не нужно доставать C'шное наследие из гроба. А нужно или, как уже посоветовали, использовать контейнер ( тот же std::vector ), или variadic templates
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
01.07.2014, 21:23  [ТС]     Как передать в функцию заранее неизвестное число параметров? #10
но допустим

C++
1
2
3
4
5
6
7
typedef void   (_stdcall *F )(int a,....);
 
void func(int a,...)
{
 
 
}
как мне вызвать функцию ф из моей функции с теми же параметрами что была вызвана моя функция?

даже точнее будет я буду считывать параметры из памяти, где их будет хз сколько, а потом передавать в F

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef void (_stdcall *F )(int a,....);
 
void func(int a,...)
{
asm
{
push 1
push 2
push 3
 
}
f();
}
так можно? нужно что то типо этого, по идее все 3 параметра пойдут в функцию
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.07.2014, 21:24     Как передать в функцию заранее неизвестное число параметров? #11
Цитата Сообщение от ZwHook Посмотреть сообщение
как мне вызвать функцию ф из моей функции с теми же параметрами что была вызвана моя функция?
Никак, если для функции F не будет варианта с va_list.
DrOffset
6422 / 3796 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
01.07.2014, 21:30     Как передать в функцию заранее неизвестное число параметров? #12
Цитата Сообщение от ZwHook Посмотреть сообщение
как мне вызвать функцию ф из моей функции с теми же параметрами что была вызвана моя функция?
В таком виде - никак. Нужно, чтобы вызываемая из твоей функции поддерживала va_list, если такого нет, то никак.
Variadic templates тут только помогут, но это только С++11.
C++
1
2
3
4
5
template <typename ...T>
void func(T... args)
{
    foo(args...);
}
Добавлено через 3 минуты
Цитата Сообщение от ZwHook Посмотреть сообщение
даже точнее будет я буду считывать параметры из памяти, где их будет хз сколько, а потом передавать в F
Лучше расскажи про природу этой F подробнее.
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
01.07.2014, 21:48  [ТС]     Как передать в функцию заранее неизвестное число параметров? #13
F функция, неуправляемом функция в коде которая собирает пакет, для отправки по сети... вот и все, тоесть передаю int i 1, s i 2, и тд единственное в эту функцию обязательно передается параметр для сборки пакета например dddsc(как с принт ф) и она по нему собирает пакет, самое интересное что она написана на c++ тоже, жалко видимо придется писать множество перегрузов вызова, или на асме(((
DrOffset
6422 / 3796 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
01.07.2014, 22:08     Как передать в функцию заранее неизвестное число параметров? #14
Цитата Сообщение от ZwHook Посмотреть сообщение
самое интересное что она написана на c++ тоже
А сигнатура у нее какая?
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
01.07.2014, 22:36  [ТС]     Как передать в функцию заранее неизвестное число параметров? #15
Вы меня все таки все обманули в длл пишем:
C++
1
2
3
4
5
extern "C" __declspec(dllexport) void _stdcall  writefunk(int a,int b)
{
    _itoa(a+b,bufstr,10);
    MessageBoxA(0,bufstr,"var",0);
}
в программе
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef void (_stdcall *F)();
 
int _tmain(int argc, _TCHAR* argv[])
{
    int a=5;
    int b = 8;
    HMODULE hnd = LoadLibraryA("test.dll");
    F f=(F)GetProcAddress(hnd,"_writefunk@8");
    _asm
    {
    push a;
    push b; 
    }
    
    f();
    return 0;
}
получаем мессендж бокс 13), проблема решена всем спасибо
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
01.07.2014, 22:56     Как передать в функцию заранее неизвестное число параметров? #16
Ох, лол, вот уж воистину: "У меня нет времени чтобы точить пилу, мне нужно пилить"
DrOffset
6422 / 3796 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
01.07.2014, 23:58     Как передать в функцию заранее неизвестное число параметров? #17
Цитата Сообщение от ZwHook Посмотреть сообщение
Вы меня все таки все обманули в длл пишем:
Хехе. Вообще-то это совсем другая ситуация. Не зря же спрашивали про сигнатуру. Количество аргументов в этом варианте фиксировано.
Если так, то можно вообще без асма:
C++
1
2
3
4
5
6
7
8
9
10
11
typedef void (_stdcall *F)(...);
 
int _tmain(int argc, _TCHAR* argv[])
{
    int a = 5;
    int b = 8;
    HMODULE hnd = LoadLibraryA("test.dll");
    F f=(F)GetProcAddress(hnd,"_writefunk@8");
    f(a, b);
    return 0;
}
А если брать вариант, какой изначально тобой озвучивался:
C++
1
2
3
4
5
void func(int n, ...)
{
 
    f(/*что сюда писать?*/);
}
то средствами С++ сделать ничего действительно нельзя (никакого обмана). Для распаковки требуется va_list, которого тут нет. А в цикле через va_arg запихать параметры в функцию не получится (нет механизма). Я думаю можно было бы придумать иной вариант,
C++
1
call(format).arg(1).arg(2).arg(3);
но не уверен, что он тебе подошел бы. Но по крайней мере мы бы остались в рамках чистого С++ и без использования С++11.
Что касается твоего варианта с ассемблером, то по поводу него вообще никто не высказывался. Ассемблер - это другой разговор совсем. Естественно будет работать, если сделать получение параметров на асме.
Так что про "обманули" - это неправда
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
02.07.2014, 08:29  [ТС]     Как передать в функцию заранее неизвестное число параметров? #18
почему фиксированное? например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
double f(LPVOID n, ...)   
{  
 LPVOID *p = &n;    
    
    while (*p)        
    { 
_asm
 {
push *p;
 }  
      p++;            
      
    }
  _asm
 {
call 0x12345678;// если конечно _stdcall если просто с++ то можно создать тип
 }  
}
и если последняя функция stdcall мы ничего не нарушаем) принципе мне идеально подходит этот вариант как мост в длл между прогами, и что в нем не правильного
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2014, 16:29     Как передать в функцию заранее неизвестное число параметров?
Еще ссылки по теме:

C++ Передать в функцию с переменным числом параметров УКАЗАТЕЛИ на другие функции
В функцию с переменным, числом параметров передать массивы целых чисел C++
C++ Как передать в функцию в качестве параметров указатель на файл

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DrOffset
6422 / 3796 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
02.07.2014, 16:29     Как передать в функцию заранее неизвестное число параметров? #19
Цитата Сообщение от ZwHook Посмотреть сообщение
и что в нем не правильного
Я еще рас скажу, про ассемблер тут никто не высказывался. Под словом "нельзя" имелись в виду исключительно средства языка
Yandex
Объявления
02.07.2014, 16:29     Как передать в функцию заранее неизвестное число параметров?
Ответ Создать тему
Опции темы

Текущее время: 01:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru