From c9f8f653adbff865d5cebdf0e46dc22680cebce4 Mon Sep 17 00:00:00 2001 From: Damien George Date: Fri, 21 Nov 2014 18:16:25 +0000 Subject: [PATCH] py: Add support for float/double arrays in array module. Addresses issue #981. --- py/binary.c | 14 ++++++++++++-- tests/float/float_array.py | 14 ++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 tests/float/float_array.py diff --git a/py/binary.c b/py/binary.c index fed69f9d1b..46a4eb694f 100644 --- a/py/binary.c +++ b/py/binary.c @@ -61,6 +61,10 @@ int mp_binary_get_size(char struct_type, char val_type, mp_uint_t *palign) { size = 8; break; case 'P': case 'O': case 'S': size = sizeof(void*); break; + case 'f': + size = sizeof(float); break; + case 'd': + size = sizeof(double); break; } break; case '@': { @@ -90,6 +94,12 @@ int mp_binary_get_size(char struct_type, char val_type, mp_uint_t *palign) { case 'P': case 'O': case 'S': align = alignof(void*); size = sizeof(void*); break; + case 'f': + align = alignof(float); + size = sizeof(float); break; + case 'd': + align = alignof(double); + size = sizeof(double); break; } } } @@ -252,10 +262,10 @@ void mp_binary_set_val_array(char typecode, void *p, mp_uint_t index, mp_obj_t v switch (typecode) { #if MICROPY_PY_BUILTINS_FLOAT case 'f': - ((float*)p)[index] = mp_obj_float_get(val_in); + ((float*)p)[index] = mp_obj_get_float(val_in); break; case 'd': - ((double*)p)[index] = mp_obj_float_get(val_in); + ((double*)p)[index] = mp_obj_get_float(val_in); break; #endif default: diff --git a/tests/float/float_array.py b/tests/float/float_array.py new file mode 100644 index 0000000000..c0f2c587cf --- /dev/null +++ b/tests/float/float_array.py @@ -0,0 +1,14 @@ +from array import array + +def test(a): + print(a) + a.append(1.2) + print(len(a), '%.3f' % a[0]) + a.append(1) + a.append(False) + print(len(a), '%.3f %.3f' % (a[1], a[2])) + a[-1] = 3.45 + print('%.3f' % a[-1]) + +test(array('f')) +test(array('d'))