- 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/
我正在尝试用 Swift 编写一个算法来计算三角形的角度。引用检查 https://www.mathsisfun.com/algebra/trig-solving-sss-triangles.html
我正在使用word2vec来表示一个小词组(3至4个单词)作为唯一矢量,方法是将每个单词嵌入相加或计算单词嵌入的平均值。 通过实验,我总是得到相同的余弦相似度。我怀疑这与在训练后将word2vec生成
我实现了一种称为离散余弦变换的图像/视频变换技术。该技术用于 MPEG 视频编码。我的算法基于以下 URL 中提出的想法: http://vsr.informatik.tu-chemnitz.de/~
好的,首先,这不适用于类、测试或其他学生类型的事件。 我是游戏的脚本编写者,正在尝试实现供所有人使用的数学库,不幸的是,我所能使用的只是非常基本的 lua。实现的版本不能更改,并且不包含任何库。对于那
我是数字人文学科的博士生。我对编程语言还很陌生。 自上个月以来,我遇到了一个困扰我的问题。我正在尝试在 Tensorboard 的嵌入投影仪上可视化 doc2vec 模型(python,gensim
我正在学习 Part 1 上提供的教程& Part 2 .不幸的是,作者没有时间在最后一节中使用余弦相似度来实际找到两个文档之间的距离。在 stackoverflow 的以下链接的帮助下,我按照文章中
我正在用Python语言识别两个正弦信号之间的时移。这方面的一些研究表明,两个输入信号之间的相关性可以解决这个问题。但是,在处理关联时,我不理解np.correlate和scipy.signal.co
我正在用Python语言识别两个正弦信号之间的时移。这方面的一些研究表明,两个输入信号之间的相关性可以解决这个问题。但是,在处理关联时,我不理解np.correlate和scipy.signal.co
我有分类文本语料库。从这些我创建向量。每个向量对应一个文档。向量分量是本文档中计算为 TFIDF 值的单词权重。接下来,我构建一个模型,其中每个类都由单个向量表示。模型具有与语料库中的类一样多的向量。
我是新来的,我的问题是数学性质的,而不是编程性质的,我想就我的方法是否有意义获得第二意见。 我试图使用函数 findAssocs 在我的语料库中找到单词之间的关联。 ,来自 tm包裹。尽管它在通过软件
我正在尝试在一个简单的用例上比较 2 个不同的 DBSCAN 集群。 1/在一种情况下,我使用 DBSCAN 的余弦度量 2/在另一种情况下,我使用余弦相似度预先计算的距离矩阵 我的问题是这两种方法没
我在 L2 归一化特征矩阵上使用 Matlab 的常规 kmeans 算法和“Distance”、“cosine”、“EmptyAction”、“drop”,但遇到了问题。 Matlab 生成的输出只
代码可以编译,但输出错误。例如,当我输入值 45 时,我得到的输出为 1.0。我使用enthought canopy IDE,我哪里出了问题? import math x = int(raw_inpu
这个问题在这里已经有了答案: Why are some functions in not in the std namespace? (3 个答案) 关闭 8 年前。 我有一个相当大的应用程序,我
找到这个代码示例 void *handle; double (*cosine)(double); handle = dlopen("libm.so", RTLD_LAZY); *(void **) (
我正在计算两个 dfm 的余弦相似度对象。一个是我的引用对象,其尺寸为 5 x 4,728,而第二个 dfm是我的目标对象,尺寸为 2,325,329 x 40,595。 我不明白的是为什么texts
我想知道 Spark Cosine Similarity 是否可以处理稀疏输入数据?我见过一些例子,其中输入由以下形式的空格分隔的特征行组成: id feat1 feat2 feat3 ... 但我有
我正在做一个关于电影数据集余弦相似度的项目,我对计算余弦相似度的公式感到困惑。 但是我上网查了一下,有些文章显示分母是这样的: sqrt(A1^2+B1^2) * sqrt(A2^2+B2^2) *
从函数定义来看: https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cosine.html sci
假设我在 python pandas.DataFrame 中有两列: col1 col2 item_1 158 173 item_2 25 191 item_3
我是一名优秀的程序员,十分优秀!