2017-02-10 5 views
0
#include "xdrfile/xdrfile_xtc.h" 
#include "xdrfile/xdrfile.h" 
#include<stdio.h> 

int main() 
{ 
    int nat; 
    int step; 
    float time; 
    float prec; 
    int status; 
    matrix box; 
    rvec k[3]; 
    XDRFILE* xfp=xdrfile_open("test2.xtc","r"); 
    status=read_xtc(xfp,nat,&step,&time,box,k,&prec); 
    xdrfile_close(xfp); 
    return 0; 
} 

Я попытался запустить код с помощью XTC библиотеки для чтения траектории кадра GROMACS ... Я получаю сообщение об ошибке,XTC Ошибка чтения файла

Segmentation error 

Можете ли вы помочь ???

+0

Вы пробовали работать в отладчик, чтобы найти *, где * в вашем коде происходит сбой? –

+0

Я бы начал добавлять 'if (xfp == NULL) {perror (" Ошибка! "); return 1;} 'перед чтением данных. – LPs

+0

просто включил шаг «if» ... Ничего особенного не происходит ... Ошибка сегментации ... –

ответ

2

Глядя на this code

Второй параметр nat должен быть установлен на значение, извлеченное read_xtc_natoms функцию. В любом случае значение должно быть инициализировано.

Кроме того, массив k ширина должна соответствовать значению nat.

#include "xdrfile/xdrfile_xtc.h" 
#include "xdrfile/xdrfile.h" 
#include<stdio.h> 

int main(void) 
{ 
    int nat; 
    int step; 
    float time; 
    float prec; 
    int status; 
    matrix box; 
    int status; 

    char fileName[] = "test2.xtc"; 

    status = read_xtc_natoms(fileName, &nat); 

    if (status != exdrOK) 
    { 
     XDRFILE* xfp = xdrfile_open(fileName, "r"); 
     if (xfp != NULL) 
     { 
      rvec k[nat]; 
      status = read_xtc(xfp, nat, &step, &time, box, k, &prec); 
      xdrfile_close(xfp); 
     } 
     else 
     { 
      perror("File not opened:"); 
     } 
    } 
    else 
    { 
     fprintf(stderr, "read_xtc_natoms failure; return code %d", status); 
    } 

    return 0; 
} 

В приведенном выше коде, я использовал VLAs создать K массив, но вы можете использовать динамическую память тоже:

#include "xdrfile/xdrfile_xtc.h" 
#include "xdrfile/xdrfile.h" 
#include<stdio.h> 

int main(void) 
{ 
    int nat; 
    int step; 
    float time; 
    float prec; 
    int status; 
    matrix box; 
    int status; 

    char fileName[] = "test2.xtc"; 

    status = read_xtc_natoms(fileName, &nat); 

    if (status != exdrOK) 
    { 
     rvec *k = malloc(nat * sizeof(rvec)); 

     if (k != NULL) 
     { 
      XDRFILE* xfp = xdrfile_open(fileName, "r"); 
      if (xfp != NULL) 
      { 
       status = read_xtc(xfp, nat, &step, &time, box, k, &prec); 
       xdrfile_close(xfp); 
      } 
      else 
      { 
       perror("File not opened:"); 
      } 

      free(k); 
     } 
     else 
     { 
      fprintf(stderr, "Error in dynamic allocation of k vector\n"); 
     } 
    } 
    else 
    { 
     fprintf(stderr, "read_xtc_natoms failure; return code %d", status); 
    } 

    return 0; 
} 
+0

Да ... Он компилируется успешно и дает правильный результат ... Можете ли вы объясните, в чем была моя проблема ??? –

+0

Как я написал yje Функция read_xtc хочет получить массив, а ширина массива должна соответствовать количеству элементов, полученных с помощью функции 'read_xtc_natoms'. В вашем коде вы создали массив с малым, который должен быть оснащен всеми данными из вашего файла, поэтому, когда функция чтения попытается записать за пределы переданного массива, он взорвется с ошибкой сегментации – LPs

Смежные вопросы