2011-04-20 17 views
1

以下代碼成功編譯並在第一次調用時返回正確的結果。再次進行相同的調用時,出現分段錯誤錯誤。Mex文件僅在第二次使用時才提供分段錯誤

//% function TF = InWindow(Date,WindowStartDates,WindowEndDates,EndHint) 
//% INWINDOW returns true for window that contains Date. All inputs must be 
//% uint32 and WindowEndDates must be sorted. 

//% EndHint is an optional input that specifies the row number to start 
//% searching from. 

#include "mex.h" 
#include "matrix.h" 
#include "math.h" 

void CalculationRoutine(mxLogical *ismember, uint32_T *Date, uint32_T *WindowStartDates, uint32_T *WindowEndDates, unsigned int *StartIndex, int NumObs) { 

mwIndex Counter; 

// Find the first window that ends on or after the date. 
for (Counter = (mwIndex) *StartIndex; Counter < NumObs; Counter++) { 
    if (*Date <= *(WindowEndDates+Counter)) { 
     break; 
    } 
} 
*StartIndex = (unsigned int) Counter; 

// Now flag every observation within the window. Remember that WindowStartDates 
// is not necessarily sorted (but WindowEndDates is). 
for (Counter = (mwIndex) *StartIndex; Counter < NumObs; Counter++) { 
    if (*Date >= *(WindowStartDates+Counter)) { 
     *(ismember+Counter) = true; 
    } 
} 

} 

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { 

    mxArray *ismember; 
    unsigned int *StartIndex; 

    //Input Checking. 

    if (nrhs == 3) { 
     // Default Hint to first entry.   
     mexPrintf("SI Starts OK.\n"); 
     *StartIndex = 1; 
     mexPrintf("SI Ends OK.\n"); 
    } else if (nrhs == 4) { 
     if (!mxIsUint32(prhs[3])) { 
      mexErrMsgTxt("EndHint must be uint32."); 
     } 
     StartIndex = mxGetData(prhs[3]); 
    } else { 
     mexErrMsgTxt("Must provide three or four input arguments."); 
    } 
    // Convert the hint to base-zero indexing. 
    *StartIndex = *StartIndex - 1; 

    // Check the inputs for the window range. 
    if (!mxIsUint32(prhs[0])) { 
     mexErrMsgTxt("DatesList must be uint32."); 
    } 
    if (!mxIsUint32(prhs[1])) { 
     mexErrMsgTxt("WindowStartsDates must be uint32."); 
    } 
    if (!mxIsUint32(prhs[2])) { 
     mexErrMsgTxt("WindowEndsDates must be uint32."); 
    } 

    if (mxGetM(prhs[1]) != mxGetM(prhs[2])) { 
     mexErrMsgTxt("WindowStartDates must be the same length as WindowEndDates."); 
    }  

    // Prepare the output array. 
    ismember = mxCreateLogicalArray(mxGetNumberOfDimensions(prhs[1]), mxGetDimensions(prhs[1])); 

    CalculationRoutine(mxGetLogicals(ismember),mxGetData(prhs[0]), 
     mxGetData(prhs[1]), mxGetData(prhs[2]), StartIndex, (int) mxGetM(prhs[1])); 

    plhs[0] = ismember; 
} 

我把它與:

>>InWindow(uint32(5),uint32((1:6)'),uint32((3:8)')) 

代碼到達兩個分割故障之前mexPrintf調用之間的線(即,第一打印呼叫,而不是第二)。

我Matlab的2007年a(是的,我知道),Win7的64位和VS 2008

回答

4

需要初始化指針StartIndex - 你是「幸運」,它的作品第一次,因爲它是不指向定義的內存位置。爲什麼不做更類似的東西:

unsigned int StartIndex; 
// and either: 
StartIndex = 1; 
// or: 
StartIndex = * (static_cast< unsigned int * >(mxGetData(prhs[3]))); 
+0

是的,就是這樣。我一直使用StartIndex作爲變量,然後切換到一個指針,以便我可以返回更新的值,但錯過了那部分。謝謝! – MatlabSorter 2011-04-20 13:38:52

相關問題