我刚才被一个奇怪的梅毒错误弄糊涂了...
将我的问题沸腾到它的核心, 我们最终会使用以下简单的梅克斯代码。 如果给定的结构字段是空的或者不是空的, 它只会显示...
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
int numElements = mxGetNumberOfElements(prhs[0]);
int numFields = mxGetNumberOfFields(prhs[0]);
mxArray* tmpData;
const char* tmpName;
for (int structIdx=0; structIdx<numElements; ++structIdx)
{
for (int fieldIdx=0; fieldIdx<numFields; ++fieldIdx)
{
tmpData = mxGetFieldByNumber(prhs[0], structIdx, fieldIdx);
tmpName = mxGetFieldNameByNumber(prhs[0], fieldIdx);
if (mxIsEmpty(tmpData))
mexPrintf("struct(%i).%s is empty
", structIdx+1, tmpName );
else
mexPrintf("struct(%i).%s contains data
", structIdx+1, tmpName );
}
}
}
如果我们编译此代码并将其命名为 structcrash
然后是以下的matlab 代码 。
clc
x.a=1;
x.b=2;
x(2).a=3;
x(2).b=4;
structcrash(x);
...提供我们可能期待的产出...
- struct(1).a contains data
- struct(1).b contains data
- struct(2).a contains data
- struct(2).b contains data
如果我们给梅克斯函数一个包含空字段的结构, 像这样...
clc
y.a = [];
structcrash(y);
...然后我们得到预期产出...
- struct(1).a is empty
现在,事情变得非常奇怪 如果你使用这样的代码...
clc
y(2).b = 4;
structcrash(y);
如果我们检查 y
结构, 现在是一个2个元素结构, 每个元素中有两个字段 。 (1). a
是空的, 正如我们上面所指定的, 并且当我们添加 b
字段时, < code> < /code> 已经自动创建并给予空值 。 同样, 当我们通过添加 y(2). b
来增加结构大小时, < code> 也是自动创建的。 结构看起来完全合乎逻辑, 但是, 使用对 mex 文件的输入, 在 egfault 中的结果 。
通过有选择地评论各种代码行,我可以确认,导致断层的指令是mxIsEmpty(tmpData)
。
有人能复制这个错误吗? 我是不是做错什么了? 对我来说,这看起来像是迷幻药API代码中的窃听器, 但我想先检查一下这里。 谢谢。
if(tmpData!=NULL) {
if (mxIsEmpty(tmpData))
mexPrintf("struct(%i).%s is empty
", structIdx+1, tmpName );
else
mexPrintf("struct(%i).%s contains data
", structIdx+1, tmpName );
}
... 和 segfault 不再发生。 但是, 这仍然非常不祥。 如果您在下面的例子中创建两个结构, 并使用工作空间视图来检查它们, 则 < code> f code > 和 < code> g < /code > 在所有方式上看起来都是完全相同的 。 我找不到它们使用标准 matlab 编程命令的不同方式 。
>> f(2).a=123;
>> g(1).a=[];
>> g(2).a=123
... 但 < code> whos code> 命令显示差异...
Name Size Bytes Class Attributes
f 1x2 192 struct
g 1x2 296 struct
...我更新的梅毒功能显然也...
>>structcrash(f)
struct(2).a contains data
>> structcrash(g)
struct(1).a is empty
struct(2).a contains data
因此,这个故事的道德是 Matlab IDE 将字段插入到一个特定的构造元素中时, 将字段插入到所有构造中, 使结构结构看起来既漂亮又平坦。 然而, 实际上, 在内在记忆中, 情况并非如此 。