4

ここに正しく実行されるCmexファイルがありますが、実行が完了すると、MATLABがsegfaultでクラッシュします。プログラムの実行が終了するとクラッシュするため、MATLABによる割り当てられたメモリの自動解放が問題の原因であると思われます。ただし、動的に割り当てられた独自の変数を解放し、mxArray構造を解放しようとはしません。見て、MATLABがクラッシュする原因を特定するのに役立つかどうかを確認してください。

#include <mex.h>
#include <matrix.h>
#include <stdio.h>

void mexFunction(
int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{ 
    /* Declare variables. */
    int i ,j, numdims, *ipos, count;
    const mwSize *dim_array;
    mwSize size;
    double *pos, rad;

    /* Ingest inputs. */
    numdims = mxGetNumberOfDimensions(prhs[0]);
    dim_array = mxGetDimensions(prhs[0]);
    rad = mxGetScalar(prhs[1]);
    pos = mxGetData(prhs[0]);
    size = dim_array[0]*dim_array[1];

    ipos = (int*) mxMalloc(size);
    for (i = 0; i < size; i++)
        ipos[i] = (int) (pos[i]*rad);
    count = 0;
    for (i = 0; i < size; i+=2)
        for (j = i + 2; j < size; j+=2)
            if (ipos[i] == ipos[j])
                if (ipos[i+1] == ipos[j+1])
                    count++;
    mxFree(ipos);

    /* Generate output */
    plhs[0] = mxCreateDoubleScalar(count);
    printf("\nProgram finished executing!\n");
}

助けてくれてありがとう!

編集:プログラムへの入力は、(順番に)2 xn行列とスカラーであることが意図されていることにも注意する必要があります。ここで、nは任意の正の整数です。実際のプログラムは寸法を正しくチェックしますが、コードスペースを節約するためにこれらの行をここに含めませんでした。

4

2 に答える 2

2

UPD。あなたは正しいです-マトリックスが大きくなると、クラッシュします:)

だから私はアイデアを持っていると思います:

2行のコードを変更してみてください

plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
mxGetPr(plhs[0])[0] = (double) count;

新しい単一行の場合

plhs[0] = mxCreateDoubleScalar(count);

私がそれをした後、それはもうクラッシュしません。

于 2012-11-04T23:41:57.550 に答える
1

動的メモリ割り当てを使用して数百のCプログラムを作成した後、間違いは次のようになったことを少し恥ずかしく思います。

交換

    ipos = (int*) mxMalloc(size);

    ipos = (int*) mxMalloc(size*sizeof(int));

私を回避するのは常に最も愚かな過ちのようです。投稿をご覧になるのに1、2分かかったかもしれない皆さんに感謝します。

于 2012-11-08T18:18:39.900 に答える