C - 将一维数组映射成两个 - 为什么这不起作用?

时间:2010-12-07 22:19:36

标签: c linux gcc

首先是错误:

 error: a value of type "float *" cannot be used to initialize an entity of type "float (*)[2000]"

见下相关代码:

#define opType float
const int N = 2000;
opType *a_h,*b_h,*d_h, *a_d,*b_d, *d_d;
opType (*normalized_a)[N] = a_h;
opType (*normalized_b)[N] = b_h;
opType (*normalized_d)[N] = d_h;

opType (*normalized_a_d)[N] = a_d;
opType (*normalized_b_d)[N] = b_d;
opType (*normalized_d_d)[N] = d_d;

我正在尝试将其规范化为两个维度,以便稍后我可以将一个双指针传递给函数,并使用简写括号语法引用这两个维度。我正在使用CUDA所以我必须有一维声明来复制内存。有什么方法可以完成上述工作吗?

此构造来自http://forums.nvidia.com/index.php?showtopic=83941&view=findpost&p=475901

int linear[10*32]; // linear array
int (*twodim)[32] = linear; // interpreted as a two-dimensional [10][32] array.
assert(&twodim[2][4] == &linear[2*32 + 4]); // these are the same

3 个答案:

答案 0 :(得分:2)

我没有看到数组初始化的数据来自哪里,但错误消息非常清楚: 您声明了6个数组,每个数组包含2000个浮点指针。当然,您无法使用单个浮点指针初始化其中一个数组。

那么您的基础数据的形式是什么?您希望如何使用它?

编辑: 好的,根据你的评论你有类似的东西

float myData[N][N];

充满了价值观。在此表单中,您可以将其作为myData [i] [j]访问。现在,如果你只是将它转换为像

这样的浮点指针
float *myDataFlat = (float*)myData;

您也可以通过myDataFlat [i * N + j]访问它。

答案 1 :(得分:0)

您无法将数组初始化为变量。您可以将某些成员初始化为constant。 在那种情况下,它将是:

opType (*normalized_a)[N] = {0}; /* all members 0 */

或者您可以使用循环或memset。

答案 2 :(得分:0)

我不是C的专家;我猜错误是由于类型不匹配(就像在C ++中一样) 我认为你必须在任务上做一些演员。为了使其可读,您必须引入typedef:

typedef float opType;
const int N = 2000;
typedef opType (*TPointerToArray)[N]; // may be defined outside of a function
opType *a_h; // no value assigned yet
TPointerToArray normalized_a; // no value assigned yet

void MyCode()
{
    ...
    a_h = ...; // i don't know how the value is assigned; it should be done first
    ...
    normalized_a = (TPointerToArray)a_h; // "normalization"
    normalized_a[100][200] = 900; // usage
    ...
}

我假设你只是为了好玩而使用全局变量;没关系 在这段代码中,从技术上讲,normalized_a是一个指向数组的指针,但我可以把它想象成一个数组数组或二维数组。