3d矩阵动态分配错误C2036:'void *'

时间:2015-12-03 20:01:57

标签: c++ c

我有一个MPI项目,我应该用cuda转换它。

问题很简单,项目使用此代码分配不同类型的3d矩阵。

void ***Matrix3Allocate(Point3 offset, Point3 size, int dataSize){
    void *matrix_data;
    void **matrix_data_ptr;
    void ***matrix;
    int nb_elements = Matrix3GetNbElements(size);

    message("Allocate matrix (%d,%d,%d) %d ko (plus pointeurs : %d ko)", 
            size.x, size.y, size.z, nb_elements * dataSize / 1024,
            size.x * ( 1 + size.y ) * sizeof(void*) / 1024);

    matrix = (void ***)secure_malloc(size.x * sizeof(void**));
    matrix_data_ptr = (void **)secure_malloc(size.x * size.y * sizeof(void*));
    matrix_data = (void *)secure_malloc(nb_elements * dataSize);

    matrix -= offset.x;
    for(int x = offset.x; x < offset.x + size.x; x++)
        matrix[x] = matrix_data_ptr + size.y * (x - offset.x) - offset.y;

    for(int x = offset.x; x < offset.x + size.x; x++)
        for(int y = offset.y; y < offset.y + size.y; y++)
            matrix[x][y] = matrix_data +
                    ((x - offset.x) * size.y * size.z +
                (y - offset.y) * size.z - offset.z) * dataSize;

    return matrix;
}

编译时我有一个错误C2036:'void *'这个部分的未知大小:

matrix[x][y] = matrix_data + ((x - offset.x) * size.y * size.z +
               (y - offset.y) * size.z - offset.z) * dataSize;

我理解为什么编译器会尖叫但是这段代码以前工作(可能使用不同的编译器)并且我想更改最少的代码。

我可以使用简单的标志吗?

是否有一个可以使其编译而没有错误的最小修改?

明显的(大)解决方案是使用c ++模板,但这是一个C项目,所以如果在C中有另一个(更简单的)解决方案...

感谢。

2 个答案:

答案 0 :(得分:3)

问题是添加了一个void指针(matrix_data + ...) 至于我解释你的代码,它应该首先将它转换为char *。 所以试试

matrix [x][y] = ((char *) matrix_data) + ...

答案 1 :(得分:1)

此行给出错误的原因:

matrix[x][y] = matrix_data + ((x - offset.x) * size.y * size.z +
                 (y - offset.y) * size.z - offset.z) * dataSize;

是指向指针添加值后,编译器需要知道具体类型,以便对下一个元素进行正确的“跨步”。由于一切都是无效*,编译器除了给你错误外别无选择。

如果你的目标是增加sizeof(char),那么你需要使用char指针。最简单的解决方法是使用指向char *的{​​{1}}:

matrix_data