Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
h3mbr0
294 / 104 / 30
Регистрация: 12.03.2012
Сообщений: 419
#1

Передать динамическое кол-во аргументов в функцию в рантайме

18.03.2018, 18:35. Просмотров 92. Ответов 1
Метки нет (Все метки)

Имеется класс функций(cdecl), принимающих разное кол-во аргументов разных типов (но только базовых - никаких стеков и векторов)
Есть указатель на подобные функции
C++
1
void(*p)(...);
Имея динамическую информацию о том, какую функцию вызвать, кол-ве и типах аргументов и сами аргументы, нужно передавать их в функцию по указателю. Т.е. аргументы поступают извне, например в виде текста.

Например: нужно передать в некоторую функцию int и float - пушится int, пушится float, функция вызывается

Возможно? Без ассемблера, и желательно не старше C++11
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2018, 18:35
Ответы с готовыми решениями:

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

Передача переменного кол-ва аргументов
Доброго времени суток. Интересует вопрос, возможно ли передать множественные аргументы функции в...

Вычислить сумму и произведение для указанного кол-ва её аргументов
Срочно помогите представить программу иллюстрирующую косвенный вызов функции и позволяющую...

Функция с переменным кол-вом аргументов char vs int
#include <iostream> #include <cstdio> using namespace std; void func (int amount, ...)

создание ф-ии с плавающим кол-вом аргументов неизвестного типа. (С / С++)
Как создать такую? Иными словами, интересует принцип работы (в плане приема аргументов) ф-ии printf...

1
Evg
Эксперт CАвтор FAQ
19278 / 7135 / 528
Регистрация: 30.03.2009
Сообщений: 19,976
Записей в блоге: 30
18.03.2018, 22:38 #2
Если я правильно понял, чего ты хочешь, то на языке это не реализуется, потому что здесь надо учитывать конкретные программные соглашения на конкретном процессоре, которые намного сложнее, чем "пушится int, пушится float". Для этого можно использовать библиотеку libffi. Например, с её помощью в JVM строятся прокладки между java и native-кодами (JNI - Java Native Interface)

Добавлено через 4 минуты
Вот один из тестов из поставки libffi. В нём строится статический вызов и динамический. А потом сравниваются результаты. То, как строится динамический вызов - судя по всему это то, что тебе надо

C
/* Area:    ffi_call
   Purpose: Check stdcall many call on X86_WIN32 systems.
   Limitations: none.
   PR:      none.
   Originator:  From the original ffitest.c  */
 
/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */
 
#include "ffitest.h"
#include <float.h>
 
static float __attribute__((stdcall)) stdcall_many(float f1,
                           float f2,
                           float f3,
                           float f4,
                           float f5,
                           float f6,
                           float f7,
                           float f8,
                           float f9,
                           float f10,
                           float f11,
                           float f12,
                           float f13)
{
  return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13);
}
 
int main (void)
{
  ffi_cif cif;
  ffi_type *args[13];
  void *values[13];
  float fa[13];
  float f, ff;
  unsigned long ul;
 
  for (ul = 0; ul < 13; ul++)
    {
      args[ul] = &ffi_type_float;
      values[ul] = &fa[ul];
    fa[ul] = (float) ul;
    }
 
  /* Initialize the cif */
  CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 13,
             &ffi_type_float, args) == FFI_OK);
 
  ff =  stdcall_many(fa[0], fa[1],
             fa[2], fa[3],
             fa[4], fa[5],
             fa[6], fa[7],
             fa[8], fa[9],
             fa[10], fa[11], fa[12]);
 
  ffi_call(&cif, FFI_FN(stdcall_many), &f, values);
 
  if (f - ff < FLT_EPSILON)
    printf("stdcall many arg tests ok!\n");
  else
    CHECK(0);
  exit(0);
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2018, 22:38

Использование функции с .dll, у которой переменной кол-во аргументов
Создал .dll, в ней есть функция с переменным количеством аргументов. В заголовочном файле .dll она...

Как передать пути в качестве аргументов приложению?
Здравствуйте. Как запускать приложения в дебагере VS с параметрами? Как передать пути...

Не могу разобраться как передать корректно передать массив из функции в функцию
//--------------------------------------------------------------------------- #pragma hdrstop ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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