Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/64: Рейтинг темы: голосов - 64, средняя оценка - 4.81
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
1

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

01.07.2014, 20:47. Показов 12445. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
как передать в функцию "func" разное число параметров? писать для каждого перегрузку, или можно передать array int??
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2014, 20:47
Ответы с готовыми решениями:

Как принять заранее неизвестное количество аргументов и передать их в конструктор?
Допустим есть функция которая создает объект template<typename T> T* createObject(typename...

Как передать в функцию переменное число параметров
Приветствую... вопрос есть положим есть функция: UART0printf(const char *fmt, ...) которая...

Возвратить данные из функции, которая имеет заранее неизвестное количество входных параметров
есть некая функция, например: public void func(params object arr) { что-то делается } в main...

Вставить в пользовательскую форму VBA неизвестное заранее число Checkbox
Добрый, день всем! В автоматом предложенных темах не нашел точного решения того, что мне нужно....

21
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
01.07.2014, 20:51 2
Разное число однотипных или разнотипных?
0
-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;
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
01.07.2014, 21:01 4
Ну тогда передавай ссылку на массив с этими параметрами и их количество.
0
-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
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
01.07.2014, 21:08 6
Ассемблер-то тут причём?
Чем плоха ссылка? Надо обязательно в стек их помещать?
Используй тогда многоточие. http://ci-plus-plus-snachala.ru/?p=63
1
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,713
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);    //--вычисляем среднее
}
0
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
01.07.2014, 21:12  [ТС] 8
то что надо!!! просто параметры передаются в не управляеймый код(
0
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
01.07.2014, 21:14 9
Цитата Сообщение от zss Посмотреть сообщение
Почитайте это
Не, не надо это читать, разве что в качестве примера, как делать НЕ нужно. Не нужно доставать C'шное наследие из гроба. А нужно или, как уже посоветовали, использовать контейнер ( тот же std::vector ), или variadic templates
0
-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 параметра пойдут в функцию
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
01.07.2014, 21:24 11
Цитата Сообщение от ZwHook Посмотреть сообщение
как мне вызвать функцию ф из моей функции с теми же параметрами что была вызвана моя функция?
Никак, если для функции F не будет варианта с va_list.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
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 подробнее.
0
-18 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 29
01.07.2014, 21:48  [ТС] 13
F функция, неуправляемом функция в коде которая собирает пакет, для отправки по сети... вот и все, тоесть передаю int i 1, s i 2, и тд единственное в эту функцию обязательно передается параметр для сборки пакета например dddsc(как с принт ф) и она по нему собирает пакет, самое интересное что она написана на c++ тоже, жалко видимо придется писать множество перегрузов вызова, или на асме(((
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
01.07.2014, 22:08 14
Цитата Сообщение от ZwHook Посмотреть сообщение
самое интересное что она написана на c++ тоже
А сигнатура у нее какая?
0
-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), проблема решена всем спасибо
0
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
01.07.2014, 22:56 16
Ох, лол, вот уж воистину: "У меня нет времени чтобы точить пилу, мне нужно пилить"
1
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
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.
Что касается твоего варианта с ассемблером, то по поводу него вообще никто не высказывался. Ассемблер - это другой разговор совсем. Естественно будет работать, если сделать получение параметров на асме.
Так что про "обманули" - это неправда
0
-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 мы ничего не нарушаем) принципе мне идеально подходит этот вариант как мост в длл между прогами, и что в нем не правильного
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
02.07.2014, 16:29 19
Цитата Сообщение от ZwHook Посмотреть сообщение
и что в нем не правильного
Я еще рас скажу, про ассемблер тут никто не высказывался. Под словом "нельзя" имелись в виду исключительно средства языка
1
7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 377
24.06.2019, 10:44 20
Voivoid, да, будем пользоваться громоздким и неудобныым по написанию кодом.
0
24.06.2019, 10:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.06.2019, 10:44
Помогаю со студенческими работами здесь

Как передать в функцию указатель на двумерный массив заранее неизвестного размера?
Ребята, скажите пожалуйста, как реализовать такую идею? Необходимо передать в функцию двумерный...

функция на неизвестное число параметров
Здравствуйте, требуется создать функцию void f(), которая будет принимать от 0 до n параметров типа...

Как передать несколько параметров в функцию
Как передать несколько параметров в функцию? пытаюсь передать переменную s она объявлена глобально...

Как создать неизвестное заранее количество обьектов?
Здравствуйте! Может для кого-то глупый вопрос, но я не могу найти решение. Допустим я создаю...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru