C 新matlab版本/体系结构上的mex代码崩溃

C 新matlab版本/体系结构上的mex代码崩溃,c,matlab,32bit-64bit,mex,C,Matlab,32bit 64bit,Mex,我有一个例程,它计算频率域中的移位不变离散小波变换,如Rice小波工具箱中指定的。该代码使用MEX(c语法),并使用一些额外的例程在单独的文件中生成假想多项式等 源文件fsidwt.c、fisidwt.c和助手例程polyphase.[chm]压缩在一个文件中: 这段代码在旧版本的matlab中运行没有问题,其他matlab函数也依赖于它 然而,当我现在编译它时,首先有一条警告消息 >> mex fisidwt.c polyphase.c % message about differ

我有一个例程,它计算频率域中的移位不变离散小波变换,如Rice小波工具箱中指定的。该代码使用MEX(c语法),并使用一些额外的例程在单独的文件中生成假想多项式等

源文件fsidwt.c、fisidwt.c和助手例程polyphase.[chm]压缩在一个文件中:

这段代码在旧版本的matlab中运行没有问题,其他matlab函数也依赖于它

然而,当我现在编译它时,首先有一条警告消息

>> mex fisidwt.c polyphase.c % message about different gcc version
>> mex fsidwt.c polyphase.c % message about different gcc version
    fsidwt.c: In function ‘multiMRFWD1D’:
    fsidwt.c:187: warning: cast to pointer from integer of different size
    fsidwt.c:188: warning: cast to pointer from integer of different size
    fsidwt.c:189: warning: cast to pointer from integer of different size
    fsidwt.c:190: warning: cast to pointer from integer of different size
这很奇怪,因为没有整数被转换到指针。但这只是一个警告,让我们继续吧

现在,mex文件fsidwt和fisidwt计算正向和反向频域移位变量小波变换

我的测试程序非常简单:

>> clear all; len_sig=256; wlevels=3; numsig=1; numtest=1; 
    % 256 points, 3 wavelet decomposition levels
>> st=4; ts=(1:(len_sig/st))'*(1:st); ts=ts(:); ts=ts*ones(1,numsig); Ts=fft(ts); 
    % sawtooth with 4 'teeth' of increasing height and its FFT
>> h=[1;1]/sqrt(2); g=qmf(h); h=[h(:) g(:)]; H=fft(h,len_sig); 
    % Haar wavelet filters and 256-point FFTs
>> [ffs ffd] = fsidwt(Ts, H, wlevels); 
    % forward wavelet transform
>> ffr=fisidwt(ffs,ffd,cH,levels); 
    % recontruction
不幸的是,它存在分段冲突,其原因我无法从核心转储输出跟踪

代码中的行[在zipfile中]http://ubuntuone.com/6zXIIuA3J4OTTlSquycMlz],fsidwt.c的行号187-190,内容如下:

Hfilter2d = (dComplexMat) dComplexMake2D ( hcomp[0],  NQ, Q);
Gfilter2d = (dComplexMat) dComplexMake2D ( hcomp[1],  NQ, Q);
Detail2d  = (dComplexMat) dComplexMake2D ( workspaced, Q, NQ);
Approx2d  = (dComplexMat) dComplexMake2D ( workspacec, Q, NQ);
所有LH均为

dComplexMat
(dComplexVec, long, long)
那是

typedef struct {double r,i;} dComplex;
typedef dComplex *dComplexVec;
typedef dComplexVec *dComplexMat;
所有的RH都是

dComplexMat
(dComplexVec, long, long)
dComplexMake2D()的代码是:

dComplexMat dComplexMake2D(
dComplexVec阵列1d,
整数宽度,整数高度){
寄存器int i;
dComplexMat theMatrix=(dComplexMat)mxCalloc(宽度、大小(dComplexVec));
矩阵[0]=(dComplexVec)数组1d;

对于(i=1;i噢,亲爱的。MathWorks帮助热线在调查时发现,
dComplexMake2D
的函数头有一个额外的
d
,我肯定至少忽略了42次

太尴尬了。但无论如何,代码就像一个梦(很快就会上线)和一个教训:

MEX警告了
dComplexMake2D
的返回类型,因为它找不到匹配的头,继续(看起来是这样),但假定返回类型
int
,链接到编译文件,其中
dComplexMake2D
返回指针(长int
大小的类型),这就是出错的地方


多亏了MathWorks的技术支持。他们确实指出调试MEX文件根本不关他们的事。

所有文件都是64位编译的吗?是的,我在编译之前删除了所有旧的MEX文件。我想他们还是得到了另一个扩展名(以前是mexglnx?现在是mexa64)。我觉得很奇怪的是,mex说指针被转换为int。这是核心转储发生的代码位(见上文)。但它在哪里——for循环在matlab 11或64位系统中不正确吗?我应该不使用寄存器吗?(这可能是一种获得速度的老式方法)【正在工作!】代码位于,一个包含所有内容的zip文件,包括熟悉的Rice小波工具箱