[PD] Getting 32 bit floating point number from 4 sequential bytes

Arda Eden ardaeden at gmail.com
Sat Apr 6 18:30:09 CEST 2019


Christof,
Yes, you are right. For this example keeping them as local variables will
be better. This code is just a scratch and I actually didn't think about
the life cycle of those variables. My first plan was to write an xsenstoOSC
converter. But when my skills are considered, I will need to read a lot of
documentation for this and I don't have time. I just have to save the day.
Thanks.

Christof Ressi <christof.ressi at gmx.at>, 6 Nis 2019 Cmt, 19:16 tarihinde
şunu yazdı:

> > Using a union would be a bit more efficient as it doesn't copy any
> memory.
>
> an optimizing compiler will very likely generate identical assembly. look
> here, how the call to memcpy is reduced to a single 'movss' instruction:
> https://godbolt.org/z/n5ueWD
>
> @Arda: shouldn't 'wrd' and 'o' be local variables instead of struct
> members? or do you need somehow to cache the value for later?
>
> Christof
>
>
> Gesendet: Samstag, 06. April 2019 um 17:27 Uhr
> Von: "Martin Peach" <chakekatzil at gmail.com>
> An: Pd-List <pd-list at lists.iem.at>
> Betreff: Re: [PD] Getting 32 bit floating point number from 4 sequential
> bytes
>
> On Sat, Apr 6, 2019 at 10:54 AM Arda Eden <ardaeden at gmail.com[mailto:
> ardaeden at gmail.com]> wrote:
>
> With this method, I got the compiler warning about breaking the strict
> aliasing rule:
> uint8_t bytes[4] = {12, 34, 56, 78};
> float f = *(float*)bytes;
>
> Yes, modern c doesn't like type punning.
>
>
>
>
> This is my code, and for now, it is working properly. But I am not sure if
> this is an efficient way or not.
>
> typedef struct _xsensparse
> {
>     t_object x_obj;
>     uint8_t wrd[4];
>     t_float o;
>     t_outlet *f1_out, *f2_out;
> } t_xsensparse;
>
> static void xsensparse_list(t_xsensparse *x, t_symbol *s, int argc, t_atom
> *argv)
> {
>     for(int i=0; i<argc; i++) {
>     x->wrd[i]=(uint8_t)atom_getfloat(argv+3-i);
>     memcpy(&x->o, &x->wrd, 4);
>     }
>     post("%f",  x->o);
>     outlet_float(x->f1_out, x->o);
> }
>
> I think the memcpy statement should be outside the for loop. As it is, it
> operates the first three times uselessly.
> Using a union would be a bit more efficient as it doesn't copy any memory.
>
> Martin
>  _______________________________________________ Pd-list at lists.iem.at
> mailing list UNSUBSCRIBE and account-management ->
> https://lists.puredata.info/listinfo/pd-list[https://lists.puredata.info/listinfo/pd-list]
>


-- 
Arda EDEN
Yıldız Teknik Üniversitesi
Sanat ve Tasarım Fakültesi
Müzik ve Sahne Sanatları Bölümü
Duysal (Ses) Sanatları Tasarımı Programı
İstanbul/Türkiye

Yildiz Technical University
Faculty of Art and Design
Department of Music and Performing Arts
Audio Design Program
Istanbul/Turkey
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puredata.info/pipermail/pd-list/attachments/20190406/5b41e368/attachment.html>


More information about the Pd-list mailing list