This is the mail archive of the guile@cygnus.com mailing list for the guile project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Hi Everybody,
I've run across some strange behaviour in dimensions->uniform-array.
For most types, both of the following work and are equivalent.
(dimensions->uniform-array '(10) 1.0)
(dimensions->uniform-array 10 1.0)
However, for shorts I get:
guile> (dimensions->uniform-array '(10) 's)
#short(0 0 0 0 0 0 0 0 0 0)
guile> (dimensions->uniform-array 10 's)
ERROR: In procedure dimensions->uniform-array in expression
(dimensions->uniform-array 10 (quote s)):
ERROR: array shape mismatch
ABORT: (misc-error)
Assuming, that both ways should work the problem is in ramap.c.
Here's a patch to make it work.
Index: ramap.c
===================================================================
RCS file: /egcs/carton/cvsfiles/guile/guile-core/libguile/ramap.c,v
retrieving revision 1.13
diff -r1.13 ramap.c
167a168,171
> case scm_tc7_svect:
> #ifdef LONGLONGS
> case scm_tc7_llvect:
> #endif
200a205,208
> case scm_tc7_svect:
> #ifdef LONGLONGS
> case scm_tc7_llvect:
> #endif
501a510,527
> case scm_tc7_svect:
> SCM_ASRTGO (SCM_INUMP (fill), badarg2);
> {
> short f = SCM_INUM (fill), *ve = (short *) SCM_VELTS (ra);
> for (i = base; n--; i += inc)
> ve[i] = f;
> break;
> }
> #ifdef LONGLONGS
> case scm_tc7_svect:
> SCM_ASRTGO (SCM_INUMP (fill), badarg2);
> {
> long long f = SCM_INUM (fill), *ve = (long long *) SCM_VELTS (ra);
> for (i = base; n--; i += inc)
> ve[i] = f;
> break;
> }
> #endif
1843a1870,1873
> case scm_tc7_svect:
> #ifdef LONGLONGS
> case scm_tc7_llvect:
> #endif
1970a2001,2020
> case scm_tc7_svect:
> {
> short *v0 = (short *) SCM_VELTS (ra0) + i0;
> short *v1 = (short *) SCM_VELTS (ra1) + i1;
> for (; n--; v0 += inc0, v1 += inc1)
> if (*v0 != *v1)
> return 0;
> return 1;
> }
> #ifdef LONGLONGS
> case scm_tc7_llvect:
> {
> long long *v0 = (long long *) SCM_VELTS (ra0) + i0;
> long long *v1 = (long long *) SCM_VELTS (ra1) + i1;
> for (; n--; v0 += inc0, v1 += inc1)
> if (*v0 != *v1)
> return 0;
> return 1;
> }
> #endif