static VALUE nary_struct_cast_array(VALUE klass, VALUE rary) { volatile VALUE vnc, nary; narray_t *na; na_compose_t *nc; VALUE opt; ndfunc_arg_in_t ain[3] = {{rb_cArray,0},{Qnil,0},{sym_option}}; ndfunc_t ndf = { iter_nstruct_from_a, NO_LOOP, 3, 0, ain, 0 }; //fprintf(stderr,"rary:");rb_p(rary); //fprintf(stderr,"class_of(rary):");rb_p(CLASS_OF(rary)); vnc = na_ary_composition_for_struct(klass, rary); Data_Get_Struct(vnc, na_compose_t, nc); nary = rb_narray_new(klass, nc->ndim, nc->shape); GetNArray(nary,na); //fprintf(stderr,"na->size=%lu\n",na->size); //fprintf(stderr,"na->ndim=%d\n",na->ndim); if (na->size>0) { opt = nst_create_member_views(nary); rb_funcall(nary, rb_intern("allocate"), 0); na_ndloop_cast_rarray_to_narray2(&ndf, rary, nary, opt); } return nary; }
/* Returns a new 1-D array initialized from binary raw data in a string. @overload from_string(string,[shape]) @param [String] string Binary raw data. @param [Array] shape array of integers representing array shape. @return [Numo::NArray] NArray containing binary data. */ static VALUE nary_s_from_string(int argc, VALUE *argv, VALUE type) { size_t len, str_len, elmsz; size_t *shape; char *ptr; int i, nd, narg; VALUE vstr,vshape,vna; narg = rb_scan_args(argc,argv,"11",&vstr,&vshape); str_len = RSTRING_LEN(vstr); elmsz = na_dtype_elmsz(type); if (narg==2) { nd = RARRAY_LEN(vshape); if (nd == 0 || nd > NA_MAX_DIMENSION) { rb_raise(nary_eDimensionError,"too long or empty shape (%d)", nd); } shape = ALLOCA_N(size_t,nd); len = 1; for (i=0; i<nd; ++i) { len *= shape[i] = NUM2SIZE(RARRAY_AREF(vshape,i)); } if (len*elmsz != str_len) { rb_raise(rb_eArgError, "size mismatch"); } } else { nd = 1; shape = ALLOCA_N(size_t,nd); shape[0] = len = str_len / elmsz; if (len == 0) { rb_raise(rb_eArgError, "string is empty or too short"); } } vna = rb_narray_new(type, nd, shape); ptr = na_get_pointer_for_write(vna); memcpy(ptr, RSTRING_PTR(vstr), elmsz*len); return vna; }