- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
找到这个代码示例
void *handle;
double (*cosine)(double);
handle = dlopen("libm.so", RTLD_LAZY);
*(void **) (&cosine) = dlsym(handle, "cos");
double (*cosine)(double);
*(void **) (&cosine)
最佳答案
是的,这是一口。cosine
是一个函数指针。所以&cosine
是指向那个指针的指针。然后当我们打一个 *
在它前面,我们正在更改原始指针,使其指向其他地方。
它有点像这样:
int i = 5;
int *ip = &i;
*ip = 6; /* changes i to 6 */
char a[10], b[10];
char *p = a;
*(&p) = b; /* changes p to point to b */
cosine
是指向函数的指针,而不是指向数据的指针。大多数情况下,函数指针指向您在程序中定义的函数。但在这里,我们正在安排制作
cosine
指向一个动态加载的函数,由
dlsym()
加载功能。
dlsym
非常特别,因为它可以返回指向数据的指针,也可以返回指向函数的指针。所以它有一个无法定义的返回类型。它被声明为返回
void *
,当然,因为那是 C 中的“通用”指针类型。(想想
malloc
。)但在纯 C 中,
void *
是通用数据指针类型;它不能保证能够与函数指针一起使用。
cosine = dlsym(handle, "cos");
dlsym
返回
void *
, 和
cosine
有类型
double (*)(double)
(即,指向采用 double 并返回 double 的函数的指针),这不是可移植的转换。
cosine
间接的值(value),而不是说
cosine = something
*(&cosine) = something
dlsym
中仍然没有好处。 case,因为类型仍然不匹配。我们有
void *
在右边,所以我们需要
void *
在左侧。而解决方法是取地址
&cosine
,否则是指向函数的指针,并将其强制转换为指向指针的指针
void
, 或
void **
,所以当我们打一个
*
在它前面我们有一个
void *
再次,这是分配
dlsym
的正确目的地的返回值。所以我们最终得到了你问的那一行:
* (void **) (&cosine) = dlsym(handle, "cos");
&
以及为了绕过分配指向-
void
的指针这一事实而进行的类型转换指向“函数指针”并不严格合法。在这个过程中,我们成功地消除了编译器警告我们所做的事情并不严格合法。 (实际上,使警告静音正是原始程序员采用这种躲避的意图。)
cosine
,就好像它是一个数据指针,将数据指针的位塞入其中。例如,如果数据指针比函数指针大,这将产生可怕的影响。 (而且,在你问“但是数据指针怎么可能比函数指针大?”之前,这正是它们的情况,例如,在“紧凑”内存模型中,回到 MS-DOS 编程的时代。 )
dlsym
的情况下,不过,没关系,我会说完全可以接受。
dlsym
不能存在于函数指针与数据指针不同的系统上,因此如果您使用
dlsym
总而言之,您必须在所有指针都相同的机器上,并且此代码将起作用。
dlsym
时必须使用类型转换来玩游戏吗? ,为什么要使用指针到指针在酒吧周围进行额外的旅行?为什么不直接说
cosine = (double (*)(double))dlsym(handle, "cos");
dlsym
的系统上)。也许有些编译器会警告这种情况,只能通过使用欺骗者、双指针技巧将其欺骗到沉默状态。
关于c++ - 如果余弦是 fptr,如何解析 *(void **) (&cosine),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46371952/
我有一个例程,它将接受 union 参数 d、theta、a 和 alpha 作为输入,并将生成相应的 4x4 齐次矩阵作为输出。我已经测试了我的矩阵乘法,它确实工作正常。我将从输入中得到 5 个矩阵
我有以下代码使用预先计算的内存表执行 Sin/Cos 函数。在下面的例子中,表格有 1024*128 个项目,涵盖了从 0 到 2pi 的所有 Sin/Cos 值。我知道我可以使用 Sin/Cos 对
问题是不言自明的。我看过几个 pi 的例子,但没有看到 trigo 函数。也许可以使用泰勒级数 as done here但我不完全确定如何在 python 中实现它。特别是如何存储这么多数字。我应该提
我开始学习 Python 中的数学模块,并试图围绕 Python 中的正弦、余弦和正切的三角函数。 我花了一些时间学习更多关于三角学的知识,并了解了直角三角形的基本公式是如何工作的: 正弦函数: si
我一个月前才开始学习这门 C++ 类(class)。现在我被分配去写一个程序来计算这个。我不知道我做错了什么。 #include #include float gatherl1(); float
这个问题在这里已经有了答案: Python cos(90) and cos(270) not 0 (3 个答案) 关闭 9 年前。 有没有办法获得角度(以弧度为单位)的精确正切/余弦/正弦? mat
这个问题在这里已经有了答案: Java Math.cos(Math.toRadians()) returns weird values (4 个答案) 关闭 10 年前。 我正在编写一个程序,我必须
我做了一个简单的计算器作为我的第一个android程序,现在我想给它添加trigonometry,log等函数。在 C 中,我们必须包含 math library 才能这样做,我似乎无法弄清楚你是如何
我正面临 objective-c 中 cos 函数的奇怪问题。我安装了带有 iOS 4.3 SDK 的 xcode 4.1.1。 我正在计算一个数的余弦值: y= cos(x*M_PI/180) 这将
尝试将以下 php 方法转换为在 .less 样式表中使用: 在 Less 中,如何在不使用特定语言的 cos()/sin() 函数的情况下实现正弦/余弦方法? .rotate(@deg) {
可以使用 iPhone 3GS 或 Pandora 的人请测试我刚刚编写的以下组装程序吗? 它应该在 NEON 矢量 FPU 上非常快速地计算正弦和余弦。我知道它编译得很好,但没有足够的硬件我无法测试
我为泰勒级数编写了以下函数来计算余弦。 double cosine(int x) { x %= 360; // make it less than 360 double rad = x
我是一名优秀的程序员,十分优秀!