gpt4 book ai didi

c++ - 需要强制转换语法来访问旧的 c api

转载 作者:行者123 更新时间:2023-11-28 03:58:46 24 4
gpt4 key购买 nike

我正在尝试在两种数据类型之间编写一个粘合函数,但我似乎无法让编译器满意。一方面,我有一个指向逻辑上是 n x 2 数组的数据 block 的指针,但声明为:

double* pData=new double[2*n];

另一方面,我有一个声明为的 c 函数

void Function(double data[][2], int n);

如果我记得我的 c 语法,data[][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]。 Typedef 有助于说明这一点:

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 已经是正确的类型。或者使用 typedef:

typedef double T[2];
T* pData = new T[n];

关于c++ - 需要强制转换语法来访问旧的 c api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1972086/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com