首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误C2109:下标要求数组或指针类型(MEX,Windows 10)

错误C2109:下标要求数组或指针类型(MEX,Windows 10)
EN

Stack Overflow用户
提问于 2020-05-19 14:24:05
回答 1查看 324关注 0票数 0

我正在使用mex在Windows10上实现C++代码,我想修改我创建的二维数组的元素,但是我一直在得到这个错误。下面是代码和错误信息。

代码语言:javascript
复制
#include <omp.h>
#include "mex.h"
#include "matrix.h"

// net.idx_phiz{m}(:,1:num_v) => get_index(net.idx_phiz{m}, num_v)

extern "C" void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
    //receive value and create output variable
    auto& matrix = prhs[0];
    auto& size = prhs[1];
    auto& out = plhs[0];

    //get size
    auto m = mxGetM(matrix);
    auto n = mxGetPr(size)[0];

    //get value
    auto val = mxGetPr(matrix);

    //create output pointer
    out = mxCreateNumericMatrix(m, n, mxDOUBLE_CLASS, mxREAL);
    auto B = (double*)mxGetPr(out);

#pragma omp parallel for schedule(static)
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            B[i][j] = val[i][j];
        }
    }
}

从最后一行中,我得到了如下错误:

代码语言:javascript
复制
error C2109: subscript requires array or pointer type

我查阅了过去的讨论,但它们通常是错误的C2109,而不是属于mex的。提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-19 14:58:03

这一行不正确,Bval是指向double的指针,因此不能进行两次索引,只能索引一次。

代码语言:javascript
复制
B[i][j] = val[i][j];

将MATLAB数组中的数据看作一维数组,其中逻辑数组的列被堆叠。给定m行和n列,您可以获得具有i + m*j的矩阵元素(ij)在内存中的位置。因此,您的复制操作应改为:

代码语言:javascript
复制
B[i + m*j] = val[i + m*j];

但是,由于n是由第二个参数给出的,所以上述情况可能会导致问题,而且不能保证输入矩阵有许多列。您需要添加一个显式测试来验证matrix至少有n列,并且它是一个双值矩阵(例如,如果它是超出界限的single类型的话),因为mxGetPr总是返回指向double的指针,而不管数组中的数据实际是什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61893460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档