以下是我最近看到的几行C ++代码。
double a[p][p];
for(i=0;i<p;i++)
{
for(j=0;j<p;j++)
{
a[i][j] = m[i][j]; //m is sth we are given.
}
}
dgeev_(&jobvl,&jobvr,&p,(double*)a,&lda,(double*)wr,(double*)wi,(double*)vl,
&ldvl,(double*)vr,&ldvr,(double*)work,&lwork,&info);
// sth else..
dgeev_
是一个函数,你可以在这里找到它的文档:
http://www.netlib.org/clapack/old/double/dgeev.c
dgeev_
以下列方式在头文件中声明,因此我们可以在C ++代码中使用C函数。
extern "C" {
void dgeev_(char*, char*, int*, double*, int*, double*, double*, double*,
int*, double*, int*, double*, int*, int*);
}
正如我们所看到的,a
是静态数组,而dgeev_
需要第{4}类型的变量doublereal *
。
(double*)a
在这做什么?
答案 0 :(得分:2)
这可能是一个错误,或者是作者在玩弄你的伎俩。
他使用C风格的强制转换将值a
“破解”为double*
类型,以便可以将二维数组视为一维数组。 (doublereal
is just an alias for double
。)
问题是,a
不是一个double*
,也不能实际转换为double*
。我不知道 可以转换为什么,因为VGA只能在C ++中作为GCC扩展使用;没有标准的措辞可供咨询。我只是得出结论,这个程序有不确定的行为(虽然它可能看起来有效,因为这些东西实际上是如何在内存中布局的。)
如果作者希望能够使用单维索引安全地读取此数组,那么他应该以这种方式开始声明(可选地在其上方提供错觉的2D索引)数据存储)。