已知内存地址的数据检索:疑难解答

时间:2017-07-12 19:45:52

标签: c matlab mex

我正在尝试在内存中提取已知大小和地址的一维双精度数组。我当前的函数(包括在下面)返回一个适当大小的数组,但完全由零组成。显然,这不是我正在寻找的数据阵列。关于如何解决这个问题(或至少一些故障排除技巧)的任何想法,将不胜感激。

P.S。我使用MATLAB R2015b处理数据。为了检索数据数组,我正在编写一个用C脚本编写的MatLab可执行文件(MEX)函数。

谢谢,

约什

修改

为了澄清,我想要做的是从仪器中提取数据;不幸的是,控制和从该仪器获取数据的唯一方法是与仪器捆绑在一起的专有软件,它恰好是.exe格式的旧编译Matlab程序。幸运的是,我们可以通过ActiveX控件自动从中获取测量值,但这些控件给出的所有内容都是包含我们感兴趣的数据的数组的大小以及双精度数组开始的内存地址。

那么,我的问题是,根据这些信息,我如何读取这个数组,以便我可以在我的Matlab程序中处理这些数据?我使用的方法是使用Matlab中的MEX功能编写一个小的C程序,但是我无法通过这个内存位置并成功读取它,如果有更好的方法可以做到这一点而不必使用小C程序我也很乐意使用它。感谢

#include "mex.h"


void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{
    double  *pointer;          /* pointer to real data in new array */
    mwSize index;

    double *address,*size,*point;
    int p;

    /* Check for proper number of arguments. */
    if (nrhs != 2) 
     { 
        mexErrMsgIdAndTxt( "MATLAB:yprime:invalidNumInputs","Two input 
arguments required.");
    }       

    address = mxGetPr(prhs[0]); 
    size = mxGetPr(prhs[1]);
    p = *address;
    point = (void*) p;
    //const void* point = mxGetPr(prhs[0]); //(double *)*address;



    /* Create an m-by-n mxArray; you will copy existing data into it */
    plhs[0] = mxCreateNumericMatrix(1, *size, mxDOUBLE_CLASS, mxREAL);
    pointer = mxGetPr(plhs[0]);

    /* Copy data into the mxArray */
    for ( index = 0; index < *size; index++ ) {
        pointer[index] = point[index];
    }

    return;
}

1 个答案:

答案 0 :(得分:0)

正如其他人指出您的代码无效,因为&#39;指向&#39;指向任意地址。如果仔细查看此代码:

address = mxGetPr(prhs[0]); 
size = mxGetPr(prhs[1]);
p = *address;
point = (void*) p;

您在地址&#39;中获取数组的地址,然后在&#39; p&#39;中获取该数组的第一个元素的值。然后在&#39; p&#39;中创造价值数据的地址在&#39;点&#39;您用来读取值。说实话,除非你确定第一个元素确实是你正在寻找的数组地址,否则我肯定无法读取数组的实际值。

如果我怀疑是正确的-mxGetPtr()给你一个指向数组的指针,就像它在创建它之后对另一个数组那样 - 那么这4行代码应该写得更像这两行:

point = (double *)mxGetPtr(phrs[0]);
size = (double *)mxGetPtr(phrs[1]);

我这样说是因为返回的数组地址是在创建后以相同的方式获得的。

PS。忘了说你需要回归&#39;为错误数量的参数发出错误。 : - )