C++ 需要强制转换语法才能访问旧的c api
我试图在两种数据类型之间编写一个粘合函数,但我似乎无法让编译器满意。一方面,我有一个指向数据块的指针,该数据块在逻辑上是一个n x 2数组,但声明为:C++ 需要强制转换语法才能访问旧的c api,c++,C++,我试图在两种数据类型之间编写一个粘合函数,但我似乎无法让编译器满意。一方面,我有一个指向数据块的指针,该数据块在逻辑上是一个n x 2数组,但声明为: double* pData=new double[2*n]; 另一方面,我有一个声明为 void Function(double data[][2], int n); 如果我记得我的c语法,那么数据[][2]实际上只是指向连续内存块的指针,但是编译器知道第二个维度的大小是2。因此,我希望获取pData并将其传递到Function(),而不使用
double* pData=new double[2*n];
另一方面,我有一个声明为
void Function(double data[][2], int n);
如果我记得我的c语法,那么数据[][2]实际上只是指向连续内存块的指针,但是编译器知道第二个维度的大小是2。因此,我希望获取pData并将其传递到Function(),而不使用memcpy。我就是不能写演员阵容。我的想法是
Function((double [][2])pData,n)
可以,但编译器(MSVC 8)不喜欢这样。有人能告诉我正确的方式来写演员,让编译器高兴
void Function(double data[][2], int n);
double* pData = new double[2*n];
Function((double (*)[2])pData, n);
形式为T[]
的函数参数与T*
相同(甚至不是一些人所期望的T*const
)。对于C和C++中的参数类型来说,这是一个特殊的情况。所以您的double[][2]
遵循这个规则,T是double[2]
。Typedefs有助于说明这一点:
typedef double T[2];
void Function(T data[], int n);
// identical to:
void Function(double data[][2], int n);
// also identical to:
void Function(double (*data)[2], int n);
因此,当T是double[2]
时,您将T*
写成double(*)[2]
您也可以这样做:
void Function(double data[][2], int n);
double (*pData)[2] = new double[n][2];
Function(pData, n);
不需要强制转换,因为pData已经是正确的类型。或使用typedefs:
typedef double T[2];
T* pData = new T[n];
我只是想说清楚,安德鲁的回答
Function(&pData, n)
不起作用,你会得到:
error C2664: 'Function' : cannot convert parameter 1 from 'double **' to 'double [][2]'
Roger Pate的compiles没有typedefs的语法如下:
Function( (double (*)[2]) &pData, n);
double data[][2]是double**,而您的pData是double*