On Apr 14, 4:00 pm, MRAB <goo...@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 -- http://mail.python.org/mailman/listinfo/python-list