segmentation fault while using ctypes
sanket
sanket.s.patel at gmail.com
Tue Apr 14 19:04:21 EDT 2009
On Apr 14, 4:00 pm, MRAB <goo... at mrabarnett.plus.com> wrote:
> sanket wrote:
> > Hello All,
>
> > I am dealing with this weird bug.
> > I have a function in C and I have written python bindings for it using
> > ctypes.
>
> > I can call this function for couple of times and then suddenly it
> > gives me seg fault.
> > But I can call same function from a C code for any number of times.
>
> > I cannot get what's going on.
>
> > here is my code.
>
> > /**********************************************/
> > /* C Function I am calling */
> > int get_hash(char *filename,int rate,int ch,unsigned char* hash,
> > unsigned int* hash_size,short* avg_f,short* avg_d){
>
> > /* some variable declarations here */
> > fp = fopen(filename,"rb");
>
> You should check the value of 'fp' here.
>
> > data = (signed short *)malloc(sizeof(signed short) * N_BLOCKS);
>
> You should check the value of 'data' here.
>
> > whereami = WAVE_HEADER_SIZE;
>
> What is 'whereami'?
>
> > while((!feof(fp)) && (fp_more == 1) && !ferror(fp)){
> > fp_data_size = fread(data,sizeof(signed short),N_BLOCKS,fp);
>
> 'fp_data_size' will be the number of signed shorts read, not the number
> of bytes. Is this OK?
>
> > whereami += fp_data_size;
>
> The final value of 'whereami' will be WAVE_HEADER_SIZE + the total
> number of signed shorts read.
>
> > fp_more = fp_feed_short(fooid,data,fp_data_size); // call to some
> > library funtion
> > } //end while
>
> > /* some arithmetic calculations here */
>
> > n = my_fp_calculate(fooid,audio_length,fp_fingerprint,&fit,&dom);
>
> > if (data != NULL)
> > free(data)
>
> I don't that 'free()' will complain if 'data' happens to be NULL,
> although you should've already checked whether 'data' is NULL when you
> malloc'ed! :-)
>
> > fclose(fp)
> > return n;
> > }
>
> > /************************* END OF C FUNCTION
> > *********************************/
> > --------------------------------------------------------------------
> > Python code
> > ---------------------------------------------------------------------
> > from ctypes import *
> > lib = cdll.LoadLibrary("/usr/lib/libclient.so")
>
> > def my_func(filename,rate,ch):
> > hash = (c_ubyte * 424)()
> > hash_size = c_uint()
> > avg_f = c_short(0)
> > avg_d = c_short(0)
> > n = lib.get_hash(filename,rate,ch,hash,byref(hash_size),byref
> > (avg_f),byref(avg_d))
> > hash = None
>
> > def main():
> > for filename in os.listdir(MY_DIR):
> > print filename
> > my_func(filename,100,10)
> > print
> > "----------------------------------------------------"
>
> > if __name__ == "__main__":
> > main()
>
> > ============== END OF PYTHON CODE ==========================
>
> > Thank you in advance,
> > sanket
> > --
> >http://mail.python.org/mailman/listinfo/python-list
>
>
Thank you for your reply.
I will make check for fp and data pointers.
But my point is this function runs fine while calling it from a C
code.
it only breaks while calling from python. So I wonder if there can be
anything wrong with ctypes module.
Thanks,
sanket
More information about the Python-list
mailing list