[gmx-users] for help about reading xtc file

Xu, Yechuan y.xu at neu.edu
Thu Aug 15 23:33:36 CEST 2013


Thank you for your reply. after I read the xdrfile.c, 

I changed the sentence as
pos=xdr_getpos((XDR*) (xtc->xdr));

like that in the file of xdrfile.c. I also copy the definition 
for XDR and xdr_op to my own code.

But I still got the errors:
seekxtc.c:61:33: error: dereferencing pointer to incomplete type
       pos=xdr_getpos((XDR *)(xtc->xdr));
                                                        ^

here are my code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <xdrfile_xtc.h>

enum xdr_op
{
   XDR_ENCODE = 0,
   XDR_DECODE = 1,
   XDR_FREE   = 2
};

typedef struct XDR XDR; 

struct XDR
{
   enum xdr_op x_op;    
   struct xdr_ops
   {
      int (*x_getlong) (XDR *__xdrs, int32_t *__lp);
      int (*x_putlong) (XDR *__xdrs, int32_t *__lp);
      int (*x_getbytes) (XDR *__xdrs, char *__addr, unsigned int __len);
      int (*x_putbytes) (XDR *__xdrs, char *__addr, unsigned int __len);
      /* two next routines are not 64-bit IO safe - don't use! */
      unsigned int (*x_getpostn) (XDR *__xdrs); 
      int (*x_setpostn) (XDR *__xdrs, unsigned int __pos);
      void (*x_destroy) (XDR *__xdrs); 
   }    
   *x_ops;          
   char *x_private;
};


int main(int argc, char *argv[])
{
   int i; 
   int step, read_return, result;
   int natoms;
   float time,prec=1000.;
   matrix box;
   rvec *x;
   XDRFILE *xtc;
   char *fname;
   unsigned int pos;

   printf("begin, argc=%d\n",argc);
   if(argc==2){
      fname=argv[1];
   }

   xtc=xdrfile_open (fname,"r");
   read_xtc_natoms (fname,&natoms);
   printf("number of atoms: %d\n",natoms);

   x = calloc(natoms, sizeof (x[0]));

   while(1){
      read_return=read_xtc(xtc,natoms,&step,&time,box,x,&prec);
      if (read_return!=0) break;

      pos=xdr_getpos((XDR *)(xtc->xdr));
      printf("%d\n",pos);

   }

   xdrfile_close (xtc);
}
Thanks,
YC


On Aug 15, 2013, at 3:09 PM, Mark Abraham wrote:

> Right, because a pointer to an XDRFILE is neither a struct nor a union
> :-) Look at how these routines are used, and consult the header files
> for the right types to give them.
> 
> Mark
> 
> On Thu, Aug 15, 2013 at 7:29 PM, Xu, Yechuan <y.xu at neu.edu> wrote:
>> Hi Everyone,
>> 
>> I want to read a certain frame in a xtc file. How can I do that?
>> I see there are xdr_getpos() and xdr_setpos(). How should I use
>> these functions?
>> 
>> I tried:
>> 
>> XDRFILE *xtc;
>> unsigned int pos;
>> 
>> pos=xdr_getpos(xtc.xdr);
>> 
>> but I got:
>> error: request for member ‘xdr’ in something not a structure or union
>> 
>> Thanks in advance.
>> YC--
>> gmx-users mailing list    gmx-users at gromacs.org
>> http://lists.gromacs.org/mailman/listinfo/gmx-users
>> * Please search the archive at http://www.gromacs.org/Support/Mailing_Lists/Search before posting!
>> * Please don't post (un)subscribe requests to the list. Use the
>> www interface or send it to gmx-users-request at gromacs.org.
>> * Can't post? Read http://www.gromacs.org/Support/Mailing_Lists
> -- 
> gmx-users mailing list    gmx-users at gromacs.org
> http://lists.gromacs.org/mailman/listinfo/gmx-users
> * Please search the archive at http://www.gromacs.org/Support/Mailing_Lists/Search before posting!
> * Please don't post (un)subscribe requests to the list. Use the 
> www interface or send it to gmx-users-request at gromacs.org.
> * Can't post? Read http://www.gromacs.org/Support/Mailing_Lists




More information about the gromacs.org_gmx-users mailing list