Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过指针调用函数并在内存块中设置参数_C++_C - Fatal编程技术网

C++ 通过指针调用函数并在内存块中设置参数

C++ 通过指针调用函数并在内存块中设置参数,c++,c,C++,C,我有个小问题: 我正在解决通过指针调用函数并在连续内存块中向其传递参数的问题。 我的目标是将函数命名为 CallFunc(void * func,void *params, unsigned int param_length); 我将发送函数指针,指向函数参数的指针,最后是参数长度,这个调用函数将用它的参数调用传递的函数 我想用C/C++写这篇文章,但如果有人知道如何用其他支持DLL生成和exportet函数的语言来解决这个问题,也可以 谢谢你的回答, 埃尔斯梅斯 p.S.>我对我的英语感到抱

我有个小问题:

我正在解决通过指针调用函数并在连续内存块中向其传递参数的问题。 我的目标是将函数命名为

CallFunc(void * func,void *params, unsigned int param_length);
我将发送函数指针,指向函数参数的指针,最后是参数长度,这个调用函数将用它的参数调用传递的函数

我想用C/C++写这篇文章,但如果有人知道如何用其他支持DLL生成和exportet函数的语言来解决这个问题,也可以

谢谢你的回答, 埃尔斯梅斯


p.S.>我对我的英语感到抱歉,但我是捷克人,谢谢:o)

如果不知道您的参数是什么类型的,则无法从void*还原它们。所以这是不可能的。 您需要更改CallFunc接口

我不确定这是否是你所需要的,但它正在发挥作用

template <typename Func>
void CallFunc(Func func)
{
    func();
}

template <typename Func, typename  Arg1_Type>
void CallFunc(Func func,Arg1_Type arg1)
{
    func(arg1);
}

template <typename Func, typename  Arg1_Type, typename  Arg2_Type>
void CallFunc(Func func,Arg1_Type arg1,Arg2_Type arg2)
{
    func(arg1,arg2);
}


//defination of CallFunc untill Arg10 or Arg20 
.....


//some function

void somefunction(int x)
{
std::cout<<x<<std::endl;
}

//and calling it in main

CallFunc(somefunction,7);
模板
void CallFunc(Func Func)
{
func();
}
样板
void CallFunc(Func Func,Arg1_类型Arg1)
{
func(arg1);
}
样板
void CallFunc(Func Func,Arg1_类型Arg1,Arg2_类型Arg2)
{
func(arg1、arg2);
}
//在Arg10或Arg20之前定义CallFunc
.....
//某些功能
void函数(int x)
{

std::coutC++0x具有可变模板,允许这种神奇:

#include <iostream>
using namespace std ;

template<typename... Args> void CallFunc (void (*func)(Args...), Args... args) {
  func (args...) ;
}

void f (int x, double y) { cout << x << ", " << y << endl ; }

int main() { CallFunc (&f, 123, 5.6) ; }
#包括
使用名称空间std;
模板void CallFunc(void(*func)(参数…,参数…){
func(args…);
}
void f(int x,double y){coutOk,再试试:)
同样,我不确定这是否是您所需要的+我认为您需要更改代码样式(因为从您的问题中我可以看出您正在做一些奇怪的事情)

以下是我的解决方案:

#include <iostream>
#include <boost/function.hpp>
using namespace std;

template <typename Ret>
void CallFunc(boost::function<Ret ()> func)
{
    func();
}


template< typename Ret, typename Arg1>
Ret CallFunc(boost::function<Ret (Arg1)> func, void * args[])
{
    Arg1 * arg1= static_cast<Arg1*> (args[0]);
    return func(*arg1);
}

template<typename Ret, typename Arg1,typename Arg2>
Ret CallFunc(boost::function<Ret (Arg1,Arg2)> func, void * args[])
{
    Arg1 * arg1= static_cast<Arg1*> (args[0]);
    Arg2 * arg2= static_cast<Arg2*> (args[1]);
    return func(*arg1,*arg2);
}

int somefunction(int x)
{
    return x*x;
}


int main()
{
    boost::function<int (int)> func(somefunction);
    int x=17;
    void * args[1];
    args[0]=&x;
    int y = CallFunc(func,args );

    std::cout<<y<<std::endl;
    return 0;
}
#包括
#包括
使用名称空间std;
样板
void CallFunc(boost::function func)
{
func();
}
模板
Ret CallFunc(boost::function func,void*args[]
{
Arg1*Arg1=static_cast(args[0]);
返回函数(*arg1);
}
样板
Ret CallFunc(boost::function func,void*args[]
{
Arg1*Arg1=static_cast(args[0]);
Arg2*Arg2=static_cast(args[1]);
返回函数(*arg1,*arg2);
}
int函数(int x)
{
返回x*x;
}
int main()
{
boost::function func(some函数);
int x=17;
void*args[1];
参数[0]=&x;
int y=CallFunc(func,args);

Java中的std::coutFunction指针往往会使我处于LOL模式。总之,简单地说,在Java中是不可能的(这就是我删除标记的原因)。这与python或pascalPascla有什么关系?或者python可以使用工具来解决此问题。pascal或python是否可以使用一个数组中的所有参数逐指针调用函数?python有一种内置机制,可以使用未知数量的参数调用函数,这一点已被很好地记录:
def call(func,args):func(*args)
将调用函数
func
将列表中的所有元素
args
作为参数传递给它。这并不是什么神奇的事情,任何python教程都会介绍这一点。这很好,但对我没有帮助,因为唯一的方法是,我如何将参数传递给这个函数,这是一个包含所有参数的参数。我希望,这可以在高级别上得到解决具有低级知识的语言将参数存储在堆栈上,然后调用函数…@Ellesmess Glan是否有一组类型,您的参数可以是,或者它们可以是任何类型?参数没有定义类型。它们只有长度。被调用的函数将知道,它在Input上有什么,但与原始帖子相比,我知道这一点-我不能传递以逗号分隔的参数,我只能在一个参数中传递所有参数:o(.add(int a,int b)…callfunc(add,(5)(8),8);其中(5)(8)是int void*Hmm存储的int…。看起来不错…但是-我试着编译这段代码(没有boost:),但我从编译器中得到了此错误消息:变量或字段“CallFunc”声明为无效。我有MinGW32(gcc)编译器和QT creator。这是什么错误?@Ellesmess Glain您需要boost库:)(需要安装并包含。如果您不想使用其他库,只需编写您自己的函数类。如果您有任何问题,请询问我:)如果不需要解决这个问题,我投票选择编写自己的函数类,但是我在C++中比较新,我现在不知道如何:-…………我感谢您可能的功能解决方案:O)好的,我编译了代码,我还有一个问题——返回值如何?我可以处理返回值(多样性还是一种类型)??@Ellesmess Glain我更改了代码,所以现在返回值:)