C++ 在for循环中设置指向双数组的指针

C++ 在for循环中设置指向双数组的指针,c++,arrays,pointers,cuda,maya,C++,Arrays,Pointers,Cuda,Maya,我有一个我想运行的算法,它使用了一个可能很长的双数组。因为数组的长度可以达到数百万,所以我把它放在GPU上,所以我需要将数组从CPP文件导出到CU文件。然而,我现在只是在CPP中进行原型设计,因为这两种情况都不起作用 在我的CPU原型中,当我尝试使用for循环设置双数组的成员时,会出现错误。例如,包括cout在内的任何操作都将给出错误c2109:下标需要CPP文件中的数组或指针类型 或者,如果从CU文件运行相同的代码,则错误:表达式必须具有指向对象类型的指针 const int size = 1

我有一个我想运行的算法,它使用了一个可能很长的双数组。因为数组的长度可以达到数百万,所以我把它放在GPU上,所以我需要将数组从CPP文件导出到CU文件。然而,我现在只是在CPP中进行原型设计,因为这两种情况都不起作用

在我的CPU原型中,当我尝试使用for循环设置双数组的成员时,会出现错误。例如,包括cout在内的任何操作都将给出错误c2109:下标需要CPP文件中的数组或指针类型

或者,如果从CU文件运行相同的代码,则错误:表达式必须具有指向对象类型的指针

const int size = 100000;

double inputMeshPts_PROXY[size][4];
inputMeshPts.get(inputMeshPts_PROXY);

int lengthPts = inputMeshPts.length();

if (useCUDA == 1)
{
    double *inputMeshPts_CUDA = &inputMeshPts_PROXY[size][4];

    myArray(lengthPts, inputMeshPts_CUDA);
}

MStatus abjBlendShape::myArray(int length_CUDA, float weight_CUDA, double *inputMeshPts_CUDA)
{
    for (int i = 0; i < length_CUDA; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            cout << inputMeshPts_CUDA[i][j] << endl;
            // inputMeshPts_CUDA[i][j] += (sculptedMeshPts_PROXY[i][j] - inputMeshPts_CUDA[i][j]); // WHAT I WANT, EVENTUALLY
        }
    }
}
const int size=100000;
双输入meshpts_代理[大小][4];
获取(inputMeshPts_代理);
int lengthPts=inputMeshPts.length();
如果(useCUDA==1)
{
double*inputMeshPts_CUDA=&inputMeshPts_代理[size][4];
myArray(lengthPts,inputMeshPts_CUDA);
}
MStatus abjBlendShape::myArray(整数长度、浮点重量、双*输入网格长度)
{
对于(int i=0;icout
inputMeshPts\u CUDA
是一个指向
double
的指针-也就是说,它可以表示一个1D数组。您将其作为一个二维数组进行访问:
inputMeshPts\u CUDA[i][j]
。这没有意义-您正在有效地将
[j]
应用到
inputMeshPts\u CUDA[i]
对象存储区


我相信您正在寻找
inputMeshPts\u CUDA[I*4+j]
-您必须自己计算2D寻址。

inputMeshPts\u CUDA
是指向
double
的指针-也就是说,它可以表示一个1D数组。您将其作为2D数组进行访问:
inputMeshPts\u CUDA[I][j]
。这没有意义-您正在有效地将
[j]
应用到
对象存储区
inputMeshPts\u CUDA[i]

MStatus abjBlendShape::myArray(int length_CUDA, float weight_CUDA, double *inputMeshPts_CUDA)
{
我相信您正在寻找
inputMeshPts_CUDA[I*4+j]
-您必须自己计算2D寻址

MStatus abjBlendShape::myArray(int length_CUDA, float weight_CUDA, double *inputMeshPts_CUDA)
{

<代码> MexHtpSsCUDA < /Cuth>只是一个指针,编译器已经丢失了所有维度信息。它需要用于<代码>输入的MexHPTSsCUA[i] [j] < /Cuffe的维度信息,转换为访问地址(字节算术,不是C++指针算术)

您可以自己提供缺少的信息,并按照Angew建议的算法进行运算,或者让编译器通过以下方式传递维度信息:

template<size_t M, size_t N>
MStatus abjBlendShape::myArray(int length_CUDA, float weight_CUDA, double (&inputMeshPts_CUDA)[M][N])
模板
MStatus abjBlendShape::myArray(int-length\u-CUDA、float-weight\u-CUDA、double(&inputMeshPts\u-CUDA)[M][N])
当然,这只有在编译时知道大小时才起作用


<代码> MexHtpSsCUDA < /Cuth>只是一个指针,编译器已经丢失了所有维度信息。它需要用于<代码>输入的MexHPTSsCUA[i] [j] < /Cuffe的维度信息,转换为访问地址(字节算术,不是C++指针算术)

您可以自己提供缺少的信息,并按照Angew建议的算法进行运算,或者让编译器通过以下方式传递维度信息:

template<size_t M, size_t N>
MStatus abjBlendShape::myArray(int length_CUDA, float weight_CUDA, double (&inputMeshPts_CUDA)[M][N])
模板
MStatus abjBlendShape::myArray(int-length\u-CUDA、float-weight\u-CUDA、double(&inputMeshPts\u-CUDA)[M][N])
当然,这只有在编译时知道大小时才起作用。

在编写以下内容时:

double *inputMeshPts_CUDA = &inputMeshPts_PROXY[size][4];
变量inputMeshPts_CUDA是一个纯指针。您不能像以前那样使用二维索引[]。现在访问它的正确方法是将索引线性化:

inputMeshPts_CUDA[i*4+j]
或者,您可以“正确”声明指针:

double (*inputMeshPts_CUDA)[4] = inputMeshPts_PROXY;
这允许您再次使用二维索引。

在编写时:

double *inputMeshPts_CUDA = &inputMeshPts_PROXY[size][4];
变量inputMeshPts_CUDA是一个纯指针。您不能像以前那样使用二维索引[]。现在访问它的正确方法是将索引线性化:

inputMeshPts_CUDA[i*4+j]
或者,您可以“正确”声明指针:

double (*inputMeshPts_CUDA)[4] = inputMeshPts_PROXY;

这允许您再次使用二维索引。

2-D数组存储为连续内存,其中一个数组的地址为
双*
(单间接寻址)但是不,指针算法不起作用。它不是i*3+j而是i*4+j。@BenVoigt是的,这就是我的意思-我想你不能在
double*
@Joky上使用2D数组索引。我想是吧。我被内部循环的限制搞糊涂了。2D数组存储为连续内存,其中一个数组的地址是
double*
(单间接寻址)。但不,指针算法不起作用。它不是i*3+j,而是i*4+j。@BenVoigt是的,这就是我的意思-我想你不能在
double*
@Joky上使用2D数组索引。我想是吧。我被内部循环的限制弄糊涂了。基于模板的解决方案的另一个缺点是,模板是针对不同的数组重新实例化据我所知,Cuda支持类似于“VLA”的声明:void func(int size,int(*ptr)[size])。基于模板的解决方案的另一个缺点是,模板会针对不同的数组大小重新实例化。据我所知,Cuda支持类似于“VLA”的声明:void func(int size,int(*ptr)[size])数组从
&inputMeshPts\u PROXY[0][0]
开始。您拥有的
&inputMeshPts\u PROXY[size][4]
已经过了尾声,甚至计算指针都是非法的。数组从
&inputMeshPts\u PROXY[0][0]
开始。您拥有的
&inputMeshPts\u PROXY[size][4]
已经过了结尾,甚至计算指针都是非法的。最后一行是一个野生指针(是的,我知道问题也做错了),最后一行是野生指针(是的,我知道问题也做错了)