天道酬勤,学无止境

C++ 和全动态函数(C++ and FULLY dynamic functions)

问题

我有绕路的问题。 众所周知,Detours 只能在 5 个字节的空间中移动(即一个 'jmp' 调用和一个 4 个字节的地址)。 因此,在类(方法)中不可能有“hook”函数,您不能提供“this”指针,因为根本没有足够的空间(这里的问题更彻底地解释了)。 因此,我整天都在集思广益以寻求解决方案,现在我想请您对这个主题提出想法,这样我就不会在不知道是否可行的情况下开始一个 3-5 天的项目。

我最初有 3 个目标,我希望“挂钩”函数是类方法,我希望整个方法是面向对象的(没有静态函数或全局对象),最糟糕/最难的部分是完全动态的。 这是我的(理论上)解决方案; 使用汇编可以在运行时修改函数(一个完美的例子是任何绕行方法)。 所以既然我可以动态修改函数,我不应该也可以动态创建它们吗? 例如; 我分配内存,比如说~30字节(通过malloc/new)。 难道不能只用对应于不同汇编运算符的二进制数替换所有字节(如 0xE9 是'jmp'),然后直接调用地址(因为它会包含一个函数)?

注意:我事先知道返回值,以及我想要绕行的所有函数的所有参数,并且由于我使用的是 GCC,thiscall 约定实际上与 _cdecl 相同。

所以这是我的想法/即将实现; 我创建了一个“功能”类。 此构造函数采用可变数量的参数(第一个参数除外,它描述了目标函数的返回值)。

每个参数都是钩子将接收的参数的描述(大小,以及它是否是指针)。 假设我想为int * RandomClass::IntCheckNum(short arg1);创建一个 Function 类 . 然后我只需要这样做: Function func(Type(4, true), Type(4, true), Type(2, false)); . 其中 'Type' 定义为Type(uint size, bool pointer) 。 然后通过汇编我可以动态地创建函数(注意:这都将使用 _cdecl 调用约定),因为我可以计算参数的数量和总大小。

编辑:在示例中, Type(4, true)是返回值 (int*),第二个Type(4, true)是 RandomClass 'this' 指针, Type(2, false)描述第一个参数 (short arg1 )。

通过这种实现,我可以轻松地将类方法作为回调,但它需要大量的汇编代码(我什至没有特别的经验)。 最后,唯一非动态的东西是我的回调类中的方法(这也需要 pre 和 post 回调)。

所以我想知道; 这可能吗? 它需要做多少工作,我在这里过头了吗?

编辑:如果我把所有的东西都说得有点模糊,我很抱歉,但是如果你想更彻底地解释一些事情,请询问!

EDIT2:我也想知道,我是否可以在某处找到所有汇编运算符的十六进制值? 一份清单会有很多帮助! 和/或是否有可能以某种方式“保存” asm(""); 内存地址的代码(我非常怀疑)。

回答1

您所描述的通常称为“thunking”,并且很常见。 从历史上看,最常见的目的是在 16 位和 32 位代码之间进行映射(通过自动生成一个新的 32 位函数来调用现有的 16 位函数,反之亦然)。 我相信一些 C++ 编译器也会生成类似的函数来将基类指针调整为多重继承中的子类指针。

这当然似乎是解决您的问题的可行解决方案,而且我预计不会有任何大问题。 只需确保使用操作系统中所需的任何标志分配内存,以确保内存是可执行的(大多数现代操作系统默认提供不可执行的内存)。

您可能会发现此链接很有帮助,尤其是在 Win32 中工作时:http://www.codeproject.com/Articles/16785/Thunking-in-Win32-Simplifying-Callbacks-to-Non-sta

关于查找汇编操作的十六进制值,我所知道的最好的参考是 NASM 汇编器手册的附录(我不只是这么说,因为我帮助编写了它)。 这里有一个副本:http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • C++反射机制:可变参数模板实现C++反射
    1. 概要   本文描述一个通过C++可变参数模板实现C++反射机制的方法。该方法非常实用,在Nebula高性能网络框架中大量应用,实现了非常强大的动态加载动态创建功能。   C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。关于可变参数模板的原理和应用不是本文重点,不过通过本文中的例子也可充分了解可变参数模板是如何应用的。   熟悉Java或C#的同学应该都知道反射机制,很多有名的框架都用到了反射这种特性,简单的理解就是只根据类的名字(字符串)创建类的实例。 C++并没有直接从语言上提供反射机制给我们用,不过无所不能的C++可以通过一些trick来实现反射。Bwar也是在开发Nebula框架的时候需要用到反射机制,在网上参考了一些资料结合自己对C++11可变参数模板的理解实现了C++反射。 2. C++11之前的模拟反射机制实现   Nebula框架是一个高性能事件驱动通用网络框架,框架本身无任何业务逻辑实现,却为快速实现业务提供了强大的功能、统一的接口。业务逻辑通过从Nebula的Actor类接口编译成so动态库,Nebula加载业务逻辑动态库实现各种功能Server,开发人员只需专注于业务逻辑代码编写,网络通信、定时器、数据序列化反序列化
  • C ++中的动态源代码[关闭](Dynamic source code in C++ [closed])
    问题 关闭。 这个问题需要更加集中。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑这篇文章来关注一个问题。 6年前关闭。 改进这个问题 如何在 C++ 中处理动态源代码? 是否可以使用 eval("foo") 之类的东西? 我有一些需要根据用户的选择调用的函数: void function1 (); void function2 (); ... void functionN (); int main (int argv, char * argv []) { char * myString = new char [100]; ... myString = "1" //user input cout << eval("function"+myString)(); } 通常是怎么做的? UPD :基于 slacy 和 clinisbut 的回答,我想我需要创建一个函数注册表。 我想它应该作为一个指向函数的指针数组。 问题来了,如何声明一个指向函数的指针数组? 回答1 你的问题的真正答案是这样的: extern "C" { void function1 (); void function2 (); void function3 (); } int main (int argv, char * argv []) { char * myString = new char
  • C++ 编译器可以优化对同一指针的重复虚函数调用吗? [复制](Can C++ compilers optimize repeated virtual function calls on the same pointer? [duplicate])
    问题 这个问题在这里已经有了答案: 从循环中提升动态类型(又名以 C++ 方式执行 Java) 4 个答案 8年前关闭。 假设我有以下代码 void f(PolymorphicType *p) { for (int i = 0; i < 1000; ++i) { p->virtualMethod(something); } } 编译器生成的代码会取消引用p的virtualMethod 1 或 1000 次的vtable条目吗? 我正在使用微软的编译器。 编辑 这是我正在查看的真实案例的生成程序集。 line->addPoint()是关注的虚拟方法。 我没有组装经验,所以我慢慢复习... ; 369 : for (int i = 0; i < numPts; ++i) test ebx, ebx je SHORT $LN1@RDS_SCANNE lea edi, DWORD PTR [ecx+32] npad 2 $LL3@RDS_SCANNE: ; 370 : { ; 371 : double *pts = pPoints[i].SystemXYZ; ; 372 : line->addPoint(pts[0], pts[1], pts[2]); fld QWORD PTR [edi+8] mov eax, DWORD PTR [esi] mov edx, DWORD PTR
  • 使用 g++ 编译动态共享库(Dynamic Shared Library compilation with g++)
    问题 我正在尝试使用 g++ 从 Program-Library-HOWTO 编译以下简单的 DL 库示例代码。 这只是一个示例,因此我可以学习如何使用和编写共享库。 我正在开发的库的实际代码将用 C++ 编写。 #include <stdlib.h> #include <stdio.h> #include <dlfcn.h> int main(int argc, char **argv) { void *handle; double (*cosine)(double); char *error; handle = dlopen ("/lib/libm.so.6", RTLD_LAZY); if (!handle) { fputs (dlerror(), stderr); exit(1); } cosine = dlsym(handle, "cos"); if ((error = dlerror()) != NULL) { fputs(error, stderr); exit(1); } printf ("%f\n", (*cosine)(2.0)); dlclose(handle); } 如果我用 gcc 编译程序,它工作正常。 gcc -o foo foo.c -ldl 当我将文件名和编译器更改为以下内容时 g++ -o foo foo.cpp -ldl 我收到以下错误:
  • 在 C++ 中动态创建函数调用(Create function call dynamically in C++)
    问题 大家好,我希望你能帮我解决这个问题: 我目前正在为脚本语言实现一个解释器。 该语言需要对 C 函数的本地调用接口,就像 java 有 JNI 一样。 我的问题是,我想在不编写包装函数的情况下调用原始 C 函数,该函数将我的脚本语言的调用堆栈转换为 C 调用堆栈。 这意味着,我需要一种方法来在运行时生成 C 函数的参数列表。 例子: void a(int a, int b) { printf("function a called %d", a + b); } void b(double a, int b, double c) { printf("function b called %f", a * b + c); } interpreter.registerNativeFunction("a", a); interpreter.registerNativeFunction("b", b); 解释器应该能够调用函数,只知道我的脚本语言的函数原型: native void a(int a, int b); 和native void b(double a, int b, double c); 有没有办法在 C++ 中生成 C 函数调用堆栈,或者我必须使用汇编程序来完成这项任务。 汇编器是一个问题,因为解释器几乎可以在任何平台上运行。 编辑:解决方案是使用 libffi,一个库
  • 如何将指针传递给函数并在函数 C++ 中动态分配内存(How to pass pointer to function and dynamically allocate memory within function C++)
    问题 我正在尝试声明一个指针并将该指针传递给分配内存的函数。 这是一个最小的例子: #include <string> #include <iostream> using namespace std; void alloc_mem(int &size, double *x); int main() { double *X; int imax; alloc_mem(imax, X); cout << "imax = " << imax << endl; for (int i = 0; i < imax; i++) { cout << "X = " << X[i] << endl; } delete[]X; return 0; } void alloc_mem(int &size, double *x) { size = 10; x = new double[size]; for (int i = 0; i < size; i++) { x[i] = (double)i; } } 这段代码可以编译,但是当我尝试打印出 X 的值时出现分段错误。我知道我没有正确地将变量传递给函数,但我不知道该怎么做。 我相信我正在对 x 的副本进行操作。 此外,编写此代码是为了重现我在更大的代码中遇到的问题。 回答1 参数double *x是函数 alloc_mem 的局部变量。 当函数结束执行时
  • C++ 在函数中分配动态内存 - 新手问题(C++ allocating dynamic memory in a function - newbie question)
    问题 我正在调查内存泄漏,从我看到的情况来看,问题如下所示: int main(){ char *cp = 0; func(cp); //code delete[] cp; } void func(char *cp){ cp = new char[100]; } 在 //code 注释中,我希望 cp 指向分配的内存,但它仍然是一个空指针,这意味着我从不删除内存。 我在发什么牢骚? 回答1 void func(char *cp){ cp = new char[100]; } 在这个函数中, char *cp 是一个“通过复制传递的指针”,这意味着它们指向相同的内存地址,但它们不是相同的指针。 当您更改内部指针,使其指向其他地方时,已传递的原始指针将继续指向 0。 回答2 您正在为cp分配已分配内存的值。 但是,这是堆栈上的一个变量:main 中cp的副本! cp是您所在函数的局部变量。 你想要的是一个参考: void func(char *& cp) 这会将cp别名为传入的参数。 回答3 参数 cp 是函数的局部变量——改变它不会改变函数之外的任何东西。 编写函数的更好方法是: char * func(){ return new char[100]; } 并且不直接处理您的问题,但您可能应该使用 std::string 和 std::vector 而不是动态分配的数组。 回答4
  • 什么是 C++ 中的早期(静态)和晚期(动态)绑定?(What is early (static) and late (dynamic) binding in C++?)
    问题 C++ 中的早期和晚期绑定是什么样的? 你能举个例子吗? 我读到函数重载是早期绑定,虚函数是后期绑定。 我读到“早期(或静态)绑定是指编译时绑定,后期(或动态)绑定是指运行时绑定”。 回答1 你没看错。 可以给出基本示例: using FuncType = int(*)(int,int); // pointer to a function // taking 2 ints and returning one. int add(int a, int b) { return a + b; } int substract(int a, int b) { return a - b; } 静态绑定是在编译时已知绑定: int main() { std::cout << add(4, 5) << "\n"; } 没有为操作的动态变化留下空间,因此是静态绑定的。 int main() { char op = 0; std::cin >> op; FuncType const function = op == '+' ? &add : &substract; std::cout << function(4, 5) << "\n"; } 而在这里,根据输入,一个人会得到 9 或 -1。 这是动态绑定的。 此外,在面向对象的语言中, virtual函数可用于动态绑定某些东西。 因此
  • C++ 静态多态而不是动态多态(C++ static rather than dynamic polymorphism)
    问题 我正在尝试构建一个通用算法。 到目前为止,我已经使用类层次结构和指针实现了这一点,如下例所示: struct Base{ virtual double fn(double x){return 0;} }; class Derived : public Base{ double A; public: Derived(double a) : A(a) {} double fn(double x) { return A*x;} }; //Some other implementations class algo{ double T; std::unique_ptr<Base> b_ptr; public: algo(double t, std::unique_ptr<Base>& _ptr); //move constructor... //Some constructors double method(double x){ return T*b_ptr->fn(x);} }; 然后按如下方式实现此设置: int main(){ std::unique_ptr<Derived> ptr(new Derived(5.4)); algo(3.2,ptr); method(2.4); return 0; } 当然,这是一个非常简单的例子,但它适用于我的问题。 据我了解
  • 是否可以在 C++ 运行时动态创建函数?(Is it possible to create a function dynamically, during runtime in C++?)
    问题 C++ 是一种静态的编译语言,在编译时解析模板等等... 但是是否有可能在运行时创建一个源代码中未描述且在编译期间未转换为机器语言的函数,以便用户可以将源中未预料到的数据扔给它? 我知道这不能以直接的方式发生,但肯定是可能的,有很多编程语言没有被编译并动态创建那种用 C 或 C++ 实现的东西。 也许如果创建所有原始类型的工厂,以及合适的数据结构将它们组织成更复杂的对象,例如用户类型和函数,这是可以实现的吗? 欢迎提供有关该主题的任何信息以及指向在线材料的指针。 谢谢! 编辑:我知道这是可能的,更像是我对实现细节感兴趣:) 回答1 是的,当然,没有在其他答案中提到任何工具,而只是使用 C++ 编译器。 只需在您的 C++ 程序中执行这些步骤(在 linux 上,但在其他操作系统上必须类似) 使用ofstream将 C++ 程序写入文件(例如在 /tmp/prog.cc 中) 通过system("c++ /tmp/prog.cc -o /tmp/prog.so -shared -fPIC");编译程序system("c++ /tmp/prog.cc -o /tmp/prog.so -shared -fPIC"); 动态加载程序,例如使用dlopen() 回答2 您也可以将字节码直接提供给函数,然后将其作为函数类型传递,如下所示。 例如 byte[3] func = { 0x90
  • C++类对象成员、动态对象、new、delete运算符申请动态空间(C++初学面向对象)
    文章目录 一、类成员对象1、类的对象2、具体参考代码 二、动态对象与new、delete1、C语言中为类的对象开辟动态空间2、C++的new开辟动态空间:类型名 *p= new 类型名3、请自定义类的动态空间,p3是一个对象指针4、申请数组的动态空间,p4是一个数组5、C++申请动态空间完整练习代码 三、动态对象(传参) 一、类成员对象 1、类的对象 简单来说,类成员对象就是在类中定义其他类的实例化对象,并调用其他的成员对象的有参/无参构造函数。 例如: 定义三个Room、Chair、Person, 然后在Person类的定义中, 再定义Room、Chair的实例化对象room和chair, 定义Person对象传入3个有参构造函数需要的参数, 并通过room、chair这两个对象对它们的成员数据进行赋值, 同时在Person类中引用room、chair对象的数据进行输出。 2、具体参考代码 #include <iostream> #include <string.h> #include <stdlib.h> using namespace std; //定义一个房间类 class Room { public: string room_name; //定义一个共有成员,字符串类型的名字 //定义有参构造函数 Room(string name) { room_name= name
  • 通过 C++ 中的函数将位分配给动态位集(Assiging bits to dynamic bitset via function in C++)
    问题 此代码使用类,类 rsa 有一个函数集,该函数集应该采用 3 个整数和 1 个动态位集。 然而编译器返回错误,我认为它们都是关于同一件事的: damage.cc: In function ‘int main()’: damage.cc:81:27: error: no matching function for call to ‘public_key::set(int, int, int, int)’ usr1.set (11, 5, 23, 00001); ^ damage.cc:81:27: note: candidate is: damage.cc:59:6: note: void rsa::set(int, int, int, const boost::dynamic_bitset<>&) void rsa::set(int p_, int q_, int d_, const boost::dynamic_bitset <>& m_ ) ^ damage.cc:59:6: note: no known conversion for argument 4 from ‘int’ to ‘const boost::dynamic_bitset<>&’ damage.cc:82:27: error: no matching function for call to
  • 如何从 C++ 函数/Qt 方法按需加载动态库(How to load a dynamic library on demand from a C++ function/Qt method)
    问题 我有如下创建的动态库 猫我的文件.cc struct Tcl_Interp; extern "C" int My_Init(Tcl_Interp *) { return 0; } 1)编译cc文件 g++ -fPIC -c myfile.cc 2)创建共享库 g++ -static-libstdc++ -static-libgcc -shared -o libmy.so myfile.o -L/tools/linux64/qt-4.6.0/lib -lQtCore -lQtGui 3)从TCL proc加载库然后我给出命令 tclsh 并给定命令 % load libmy.so 是否有任何等效于 load 的 C++ 函数/Qt 可以从另一个 C++ 函数按需加载共享库。 我的要求是在函数内部运行时加载动态库,然后直接使用qt函数 1)加载qt共享库(对于lib1.so) 2)直接调用函数而不调用resolve 例如,我们有 dopen,但是对于每个函数调用,我们必须调用 dsym。 我的要求是只调用共享库然后直接调用这些函数。 回答1 您想要无样板延迟加载。 在 Windows 上,MSVC 通过发出通过函数指针解析函数的存根来实现延迟加载。 你也可以做到的。 首先,让我们观察一下,如果您所做的只是调用它们,函数指针和函数是可以互换的。 调用函数或函数指针的语法是相同的:
  • C 回调函数的 C++“动态”函数指针(C++ "Dynamic" function pointers for C callback functions)
    问题 我有一个用于管理相机配置的 API。 有 344 个单独的选项需要管理。 当某个值发生变化时,API 会调用回调函数来通知程序。 注册函数需要一个 void RegisterCallback(Option * ptr, void (fn*)(void*)) 函数指针作为回调函数。 我不能使用单个函数进行回调,因为我现在知道回调来自. 一种解决方案是创建 344 个单独的回调函数: void callback0(void*); void callback1(void*); ... void callback{n-1}(void*); static void(*)(void*) callbacks[] = {callback0, callback1, ..., callback{n-1}}; 对于此解决方案,我需要使用单独的工具/脚本生成标头。 另一种解决方案是使用一些预处理器魔法(BoostPP),比如 BOOST_PP_FOR((0,1024), PRED, OP, MYSTERIOUS_CALLBACK_MACRO); 根据我的经验,这些宏对于开发人员来说是不可读的,并且难以维护。 理想情况下,我可以使用类似RegisterCallback(popt, [n](void*){/*n-th callback*/}); 但是 lambda 函数是一个函子而不是函数指针。
  • 动态链接和 Python SWIG (C++) 在 C++ 中工作在 python 中失败(Dynamic linking and Python SWIG (C++) works in C++ fails in python)
    问题 我有一个库,我使用 SWIG 为其创建了一个 python 包装器。 库本身接受用户提供的函数,这些函数位于动态链接的 .so 文件中。 目前,我正在处理一个我自己创建并设法使动态链接工作的...在 C++ 中。 当我尝试在 python 中运行它时,我收到未定义的符号错误。 这些符号不存在于提供的 .so 文件中,但存在于主程序中(本质上它们是允许提供的模块从主程序访问数据的函数)。 我在 C++ 中运行一个简短的测试程序没有遇到任何错误,但是使用这个包装器(以前工作过)在 python 中的一个简短的测试程序失败了。 我想不出为什么它会在 C++ 中而不是在 python 中失败的解释。 让我稍微担心的是 C++ 无法正常工作但没有告诉我的想法,并且 python 正在拾取 C++ 没有的错误。 然而 C++ 返回的结果是准确的,所以这似乎不太可能。 任何想法这是怎么可能的,因此我如何解决它? 谢谢。 更新:我已将此代码添加到程序的顶部: import dl sys.setdlopenflags(dl.RTLD_NOW | dl.RTLD_GLOBAL) 这消除了运行时错误,但不幸的是会出现第二个问题(仍然是由于链接)。 从作为主程序一部分的动态链接库中调用的函数没有返回正确的值。 它们返回 0。更明显的是,它们甚至根本没有运行。 问题变成了实际运行的是什么,为什么它与
  • C++ 将动态大小的二维数组传递给函数(C++ passing Dynamically-sized 2D Array to function)
    问题 我想弄清楚如何将动态构造的二维数组传递给函数。 我知道必须指定列数,但就我而言,这取决于用户输入。 有什么解决方法吗? 例子: // Some function void function(matrix[i][j]) { // do stuff } // Main function int N; cout << "Size: "; cin >> N; int matrix[N][N]; for (int i=0;i<N;i++) { // for (int j=0;j<N;j++) { cin >> matrix[N][N]; } } sort(matrix); 你明白了:) 回答1 如果您使用 C++,合理的选择是: 使用boost::multi_array (推荐),或制作自己的二维数组类。 好吧,您不必这样做,但是将 2D 数组逻辑封装在一个类中很有用,并且可以使代码变得干净。 手动二维数组索引如下所示: void func(int* arrayData, int arrayWidth) { // element (x,y) is under arrayData[x + y*arrayWidth] } 但说真的,要么用一个类来包装它,要么享受 Boost 已经为你准备好了这个类。 手动索引它很烦人,并且会使代码更加不干净和容易出错。 编辑 http://gcc.gnu
  • C++ 动态 WX 菜单绑定(C++ Dynamic WX Menu Bindings)
    问题 我正在使用 wxMenu,并且想要一种处理事件的方法。 我真的只需要处理单击菜单项时发生的事件的东西。 具体来说,给定一个任意函数指针(形式为 void(*)(void)),我想让它在给定事件发生时调用该函数指针。 菜单不会提前知道,所以我理解的事件表已经出来了。 我找到了 Bind 和 Connect,但两者似乎都不起作用(也请参阅 Connect)。 添加代码: class Menu : public wxMenu { public: void handle_event(wxCommandEvent& event) { volatile int i = 6; //to prevent this method being optimized out //breakpoint here that never gets hit //selecting a callback to call (based on event.GetID()) could go here } }; //Later, in a function (menu is instance of Menu) menu->Connect( wxEVT_COMMAND_MENU_SELECTED, (wxObjectEventFunction)(&Menu::handle_event), NULL,menu ); /
  • C++ 传递由参数决定的动态数组(C++ Passing Dynamic Array Determined by Parameter)
    问题 这个函数在这里被问过几次,但我对一个特定的案例感兴趣。 是否可以通过附加参数定义传递的数组大小? 举个例子,假设我想要一个函数来打印一个二维数组。 但是,我的数组可能不会每次都具有相同的维度。 如果我可以有其他参数来定义该数组的大小,那将是理想的。 我知道我可以根据需要轻松地在此处将n切换为数字,但是如果我有更复杂的函数和单独的头文件,每次出现不同大小的数组时都去编辑头文件似乎很愚蠢。 以下导致error: use of parameter 'n' outside function body...我理解但想找到一些解决方法。 我也试过g++ -std=c++11但仍然是同样的错误。 #include <iostream> using namespace std; void printArray(int n, int A[][n], int m) { for(int i=0; i < m; i++){ for(int j=0; j<n; j++) { cout << A[i][j] << " "; } cout << endl; } } int main() { int A[][3] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} }; printArray(3, A, 4); return 0; } 据说,这可以用 C99 来完成
  • C++ Visual Studio 2010,实现动态堆栈时编译错误C3867(C++ Visual Studio 2010, compile error C3867 when implementing dynamic stack)
    问题 目前正在使用具有动态内存分配的堆栈为我在大学的数据结构课上做作业。 目前,我收到编译错误 C3867,说我缺少参数列表中的函数调用。 我不太明白这个错误是从哪里来的/我很难确定我的代码中的错误到底是什么; 所以我想知道是否有人可以向我解释它是什么,也许是一个要记住的友好提示,这样我就不会再发生这种情况了。 另外,我为糟糕的格式道歉,如果很难阅读,我之前从未在这里发布过。 :( 代码贴在下面。 感谢致敬。 :P 头文件: #ifndef STACK_H #define STACK_H #include <iostream> #include <iomanip> struct Node { Node *nextPtr; int value; }; class Stack { public: //Constructors and Deconstructers Here Stack(); //Default Constructor ~Stack(); //Default Deconstructor //logical methods || functions here bool isEmpty(void); //prototype checks if stack is empty //stack operations || function prototypes here void
  • Eigen——C++矩阵运算库
    Eigen——C++矩阵运算库 1.Eigen是什么?2.下载配置3.使用3.1 模块和头文件3.2 每个具体使用,下面有相对官网的中文博客3.3 下面只记录我要用的,一边用一边记 1.Eigen是什么? Eigen是一个基于C++模板的开源库,支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。 2.下载配置 官网:Eigen官网,下载解压缩可以重命名为eigen3。官网介绍使用Eigen,只需要下载它的源码,事实上,Eigen子目录中的头文件是使用Eigen编译程序所需的惟一文件。所有平台的头文件都是相同的。不需要使用CMake或安装任何东西。 写一个简单的项目,包含头文件。注:Eigen使用源代码方式提供用户使用,在使用时只需要包含Eigen头文件即可使用。 #include <iostream> #include <Eigen/Dense> using Eigen::MatrixXd; int main() { MatrixXd m(2,2); //MatrixXd类型,代表一个任意大小的矩阵 m(0,0) = 3; m(1,0) = 2.5; m(0,1) = -1; m(1,1) = m(1,0) + m(0,1); std::cout << m << std::endl; } 在项目——属性——C/C++——常规——附加包含目录添加该库位置就好了