From: barabba Date: 2007-03-18T05:40:06+09:00 Subject: Re: SWIG typemap for ta-lib On Mar 15, 1:52 pm, "BENI" wrote: > I got most of your points. > > I am still confused with TA_RetCode > > I am being bugged by the compiler > > C:\talib\ta-lib\swig\ide\msvc\talibruby\rubytalibdll > \rubytalib_wrap.c(1623) : error C2065: 'TA_RetCode' : undeclared > identifier > > How do I make SWIG aware of my TA_Retcode type? > > am I making some mistake pertaining to header inclusion in .i file ? > > a snap of my wrap fn > > =========================================== > ========================================== > SWIGINTERN VALUE > _wrap_TA_MA(int argc, VALUE *argv, VALUE self) { > int arg1 ; > int arg2 ; > double *arg3 ; > int arg4 ; > int arg5 ; > int *arg6 = (int *) 0 ; > int *arg7 = (int *) 0 ; > double *arg8 ; > TA_RetCode result; /* I did not get it here */ > int val4 ; > int ecode4 = 0 ; > VALUE vresult = Qnil; > > if ((argc < 3) || (argc > 3)) { > rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); > SWIG_fail; > } > { > Check_Type(argv[0], T_ARRAY); > > /* Get the length of the array */ > int size = RARRAY(argv[0])->len; > int i; > arg3 = (unsigned char*) malloc(size * sizeof(double)); > arg2 = size; > arg1 = 0; > > // copy the ruby array in the new allocated buffer > /* Get the first element in memory */ > VALUE *ptr = RARRAY(argv[0])->ptr; > for (i=0; i < size; i++, ptr++) > { > /* Convert Ruby Object Fixnum to unsigned char */ > arg1[i]= NUM2DBL(*ptr); > } > > } > ecode4 = SWIG_AsVal_int(argv[1], &val4); > if (!SWIG_IsOK(ecode4)) { > SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "TA_MA" > "', argument " "4"" of type '" "int""'"); > } > arg4 = (int)(val4); > { > int out_beg_ix = 0; > int out_n_ele = 0; > double arr_res[400]; > > arg5 = NUM2INT(optInMAType); > arg6 = &out_beg_ix; > arg7 = &out_n_ele; > arg8 = arr_res; > > } > result = TA_MA(arg1,arg2,(double const > (*))arg3,arg4,arg5,arg6,arg7,arg8); > { > int iStartIx = *arg6; > int iLen = iStartIx + *arg7; > > VALUE arr = rb_ary_new2(iLen); > > for ( int i = iStartIx; i < iLen; i++ ) > rb_ary_push(arr, INT2FIX((*arg8)[i])); > vresult = arr; > > } > return vresult; > fail: > return Qnil; > > } > > Thanks > > Regards for TA_RetCode you have to declare in .i file the header file where TA_RetCode is defined. After %module declaration in .i you can use %{ #include "xxxxxTA_RetCodeincludefile.h" This to avoid compiler error in your wrap function. To export TA_RetCode to ruby you can use, at the end of .i file, this declaration: %include "xxxxxTA_RetCodeincludefile.h"