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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 4.00
ZwHook
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
#1

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

01.07.2014, 20:47. Просмотров 1125. Ответов 18
Метки нет (Все метки)

как передать в функцию "func" разное число параметров? писать для каждого перегрузку, или можно передать array int??
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2014, 20:47     Как передать в функцию заранее неизвестное число параметров?
Посмотрите здесь:
C++ Как принять заранее неизвестное количество аргументов и передать их в конструктор?
C++ функция на неизвестное число параметров
C++ Как передать в функцию указатель на двумерный массив заранее неизвестного размера?
C++ Как передать в функцию в качестве параметров указатель на файл
Как передать в функцию число и структуру побайтно? C++
C++ Cоздание неизвестное заранее количество переменных
В функцию с переменным, числом параметров передать массивы целых чисел C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
5124 / 4444 / 1482
Регистрация: 14.04.2014
Сообщений: 17,658
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
5124 / 4444 / 1482
Регистрация: 14.04.2014
Сообщений: 17,658
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
5124 / 4444 / 1482
Регистрация: 14.04.2014
Сообщений: 17,658
01.07.2014, 21:08     Как передать в функцию заранее неизвестное число параметров? #6
Ассемблер-то тут причём?
Чем плоха ссылка? Надо обязательно в стек их помещать?
Используй тогда многоточие. http://ci-plus-plus-snachala.ru/?p=63
zss
Модератор
Эксперт С++
6285 / 5888 / 1909
Регистрация: 18.12.2011
Сообщений: 15,120
Завершенные тесты: 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
673 / 276 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
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
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
01.07.2014, 21:24     Как передать в функцию заранее неизвестное число параметров? #11
Цитата Сообщение от ZwHook Посмотреть сообщение
как мне вызвать функцию ф из моей функции с теми же параметрами что была вызвана моя функция?
Никак, если для функции F не будет варианта с va_list.
DrOffset
6922 / 4115 / 942
Регистрация: 30.01.2014
Сообщений: 6,910
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
6922 / 4115 / 942
Регистрация: 30.01.2014
Сообщений: 6,910
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
673 / 276 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
01.07.2014, 22:56     Как передать в функцию заранее неизвестное число параметров? #16
Ох, лол, вот уж воистину: "У меня нет времени чтобы точить пилу, мне нужно пилить"
DrOffset
6922 / 4115 / 942
Регистрация: 30.01.2014
Сообщений: 6,910
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++ Передать в функцию целое число. Функция заменяет его на ближайшее простое число, которое больше или меньше исходного. Вернуться в main( ) и распечатат
Передать функции массив как несколько параметров C++
Функция с переменным числом параметров заранее неизвестного типа C++
C++ Неизвестное число повторений в цикле

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru