gpt4 book ai didi

c - 从已知内存地址 : Troubleshooting 检索数据

转载 作者:行者123 更新时间:2023-11-30 19:33:42 25 4
gpt4 key购买 nike

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

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

谢谢

乔什

编辑:

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

那么,我的问题是,鉴于这些信息,我如何读取这个数组,以便我可以在我的 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;
}

最佳答案

正如其他人指出的那样,您的代码无法正常工作,因为“point”指向任意地址。如果您仔细查看此代码:

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

您将在“address”中获取数组的地址,然后在“p”中获取该数组的第一个元素的值,然后使“p”中的该值成为“point”中数组的地址,其中您用来读取值。老实说,除非您确定第一个元素确实是您要查找的数组的地址,否则我确信将无法读取数组的实际值。

如果我怀疑的是正确的 -mxGetPtr() 为您提供了一个指向该数组的指针,就像创建它后对其他数组所做的那样 - 那么这 4 行代码应该写得更像这样两行:

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

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

PS。忘了说,在发出参数数量错误的错误后,您需要“返回”。 :-)

关于c - 从已知内存地址 : Troubleshooting 检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45066317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com