_xdr_read_xtc関数を使ってxtc軌道を読み込むPythonのC拡張モジュールがあります。Python C拡張モジュールのSIGSEGV
モジュールは問題なく.soライブラリに組み込まれており、ほとんどの場合、うまく動作します。しかし、時には私は 'セグメンテーションフォールト(コアダンプ)'を取得します。
static PyObject * _xdr_read_xtc(PyObject *self, PyObject *args)
{
int natoms;
XDRFILE *xd;
xd = (XDRFILE *) malloc(sizeof(XDRFILE));
if (xd == NULL){
return NULL;}
XDRFILE *dummy;
dummy = xd;
if (!PyArg_ParseTuple(args, "ii", &xd, &natoms)){
return NULL;
}
free(dummy);
int step = 0;
float time;
float prec;
matrix box;
rvec *x;
x = malloc(natoms * sizeof(*x));
if (x == NULL){
return NULL;}
// read frame
int status = read_xtc(xd, natoms, &step, &time, box, x, &prec);
if (status == 0 | status == 11){
npy_intp dims[2]= {natoms, 3};
PyArrayObject *matout = (PyArrayObject *) PyArray_SimpleNewFromData(2, dims, NPY_FLOAT, x);
PyArray_ENABLEFLAGS(matout, NPY_ARRAY_OWNDATA);
PyObject *Frame = Py_BuildValue("Oii", matout, status, step);
Py_DECREF(matout);
return Frame;
}
else{
free(x);
return NULL;
}
}
Valgrindでデバッグすると、プロセス11(SIGSEGV)のデフォルト動作でプロセスが終了します。アドレス0x195688988 'のマップされた領域内にないアクセス:
int status = read_xtc(xd, natoms, &step, &time, box, x, &prec);
コードに間違いがありますか?無効なポインタかもしれない?それとも記憶上の問題でしょうか?
ありがとうございます!
[こちらの回答](https://stackoverflow.com/a/42154502/8051589)help?私は 'xd'(最初のパラメータ)は' xdrfile_open'で開かれ、 'natoms'(2番目のパラメータ)は' read_xtc_natoms'によって初期化されなければならないと思います。 –
あなたの返信ありがとう!私はすでにその投稿をチェックしていました。xdとnatomsの引数は、xdrfile_openとread_xtc_natoms関数の結果です。 –