【问题标题】:C within C++ codeC++ 代码中的 C
【发布时间】:2012-04-25 03:32:57
【问题描述】:

我编写了一个 C++ 应用程序,我需要在其中调用一个用 C 语言编写的数学函数。原型如下所示:

void Jacobi_Cyclic_Method(double *eigenvalues, double *eigenvectors, double *A, int n);

我的问题是我似乎无法传递函数 double *(例如,特征向量和 A 都是多维数组。传递这些东西的 C++ 方式似乎是

double [][size]

我已经阅读了有关 extern C 的信息,但我认为它不适用于这里,因为我不是与对象交互而是与源本身交互。如何发送该 C 函数我的多维数组定义如下:

double [100][100] A;
double [100][100] eigenvectors;
double [100] eigenvalues;

尝试编译我得到:

error: no matching function for call to ‘MathEngine::Jacobi_Cyclic_Method(double 
[100], double [100][100], double [100][100], int)’
mathEngine.h:9: note: candidates are: static void    
MathEngine::Jacobi_Cyclic_Method(double*, double*, double*, int)

【问题讨论】:

  • 您是重新编译所有内容,包括您的数学函数的实现,还是链接到现有的编译库?这对于extern "C" 是否重要很重要
  • 与在 C 中定义数组的方式相同。
  • 您应该能够直接传递这些值。 double[100]double *double[100][100] 也是。尝试时出了什么问题?
  • 您的 C 原型需要用于特征值、特征向量和 A 的一维数组。我错过了什么吗?
  • 我正在从它的源代码重新编译。当我尝试编译时,我用我尝试编译时得到的内容编辑了我的帖子

标签: c++ c extern


【解决方案1】:

问题可能在于您的Jacobi_Cyclic_Method 函数要求矩阵采用列或行主要格式,其中每一列/行都连续存储在单个一维数组中。例如。对于大小为 mxn 的行主矩阵,任何给定行中的元素都是连续存储的,并且行 i 和列 j 中的项目将是在 i*n+j 位置(对于从零开始的索引 ij)。如果矩阵是列优先的,它将位于位置 i+j*m

在 C/C++ 中使用多维数组通常不是您想要的,因为类似

double A[100][100];

不是二维数组,而是长度为 100 的单个数组,其中包含指向长度为 100 的数组的指针。因此,A 中的行不是连续存储的。

【讨论】:

  • 嗯,方法在这里定义:code.google.com/p/biaxmc2/source/browse/trunk/montecarlo2/mc2/… 看来它确实接受了一个double[][]。
  • cmets 是这么说的,但代码的说法不同。如果它接受double[][],则矩阵的参数声明应该是double** A,而不是double* A。 ——顺便说一句,你是什么人,你会选择这样一个不尊重、愚蠢的用户名?!
  • 哇!你知道我的名字取自我在不久前玩的游戏中看到的一个人,当然不知道化学战方面。在我查到它之前,我对你的评论感到很困惑。我有一个穿着橙色西装的人的头像等。当然没有冒犯的意思,我道歉。感谢您指出这一点。
  • ;-) 很高兴你没有选择这个名字,知道它的含义。也为我的严厉反应道歉。无论如何,如果人们选择与其真实姓名相关的显示名称,我通常更喜欢它。
【解决方案2】:

我假设您的 C 函数的某些参数需要多维数组,并且原型是用指向数组/矩阵参数的双精度数的指针编写的,其中整数参数表示每个维度的大小(我猜矩阵是正方形的?)。如果是这种情况,那么您可以将指针传递给每个数组/矩阵的第一个元素,如下所示:

Jacobi_Cyclic_Methods(&eigenvalues[0], &eigenvectors[0][0], &A[0][0], 100);

您的初始尝试不起作用,因为例如eigenvectors 的类型是double[100][100],它衰减为double (*)[100],而不是double *

This 帖子解决了指针和多维数组的问题。

【讨论】:

  • 除非函数文档指出double[100][100] 是正确的格式,否则我不会尝试这个。检查函数是否需要行优先或列优先矩阵布局。
  • 这个很有道理,我回家试试。谢谢
  • 这具有直接转换为 (double *) 的确切效果。这两种方法都可以让我编译,但我仍然对 C 函数认为内存布局的方式与实际情况之间存在问题。也就是说,这可以作为我原始帖子的解决方案。
  • 使用矩阵操作时,值得记住的是,C 和 C++ 以行优先顺序存储它们。以列优先顺序迭代矩阵会产生巨大的性能问题。除非整个矩阵适合单个缓存行,否则每次增加列索引时都会发生缓存未命中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 2011-03-16
  • 1970-01-01
  • 2013-11-12
  • 2011-08-27
  • 2013-09-20
  • 1970-01-01
相关资源
最近更新 更多